同时为静态库和可执行文件创建makefile

Posted

技术标签:

【中文标题】同时为静态库和可执行文件创建makefile【英文标题】:create makefile for static library and executable simultaniously 【发布时间】:2015-05-11 16:50:30 【问题描述】:

我有 3 个文件应该包含在静态库中(file1.c、file2.c、file3.c)和一个文件应该包含主函数(main.c 文件)并链接到静态库。

我想创建一个生成库,然后创建可执行文件。

我的基础 makefile 是:

CC=gcc
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=file1.c file2.c file3.c
OBJECTS=$(SOURCES:.c=.o)
OUT=libctest.a
EXECUTABLE=hello
LDFLAGS = -static

.c.o:
    $(CC) $(CFLAGS) -c $< -o $@

$(OUT): $(OBJECTS)
    ar rcs $(OUT) $(OBJECTS)

all:
    (CC) -o $(EXECUTABLE) main.c $(OUT)

clean:
    rm -f $(OBJECTS) $(OUT)

已创建库但未创建可执行文件(全部:(CC) -o $(EXECUTABLE) main.c $(OUT)) 知道需要什么吗?

【问题讨论】:

(CC) -o $(EXECUTABLE) main.c $(OUT) 这是您的问题或实际生成文件中的错字吗?它应该是 $CC 这是一个错字,不能使用美元符号 【参考方案1】:

默认情况下,Make 将处理Makefile 中的第一个目标。在您的情况下,这是 .c.o 目标。要将all 设为默认目标,请将其移至顶部。许多人更喜欢all 不会做任何事情而是依赖他人的风格。类似的东西:

all: $(EXECUTABLE)

$(OUT): $(OBJECTS)
    ar rcs $(OUT) $(OBJECTS)

$(EXECUTABLE): main.c $(OUT)
    (CC) -o $(EXECUTABLE) main.c $(OUT)

【讨论】:

@Moti,也不要忘记将$(EXECUTABLE) 添加到clean 工件中。 澄清一下:.c.o 目标不被视为 makefile 中的默认目标:make 选择 makefile 中的第一个 explicit 目标,.c.osuffix rule 是一个隐含的目标,所以不算。正如您所看到的行为所期望的那样,第一个显式目标是 $(OUT)libctest.a

以上是关于同时为静态库和可执行文件创建makefile的主要内容,如果未能解决你的问题,请参考以下文章

什么叫静态库和动态库

Makefile常用万能模板(包括静态链接库动态链接库可执行文件)

Makefile常用万能模板(包括静态链接库动态链接库可执行文件)

Linux学习——动态链接库和静态链接库

dll和lib(包括静态链接库和与dll同时生成的lib)

将静态库和动态库链接到相同的可执行文件会导致哪些问题?