C:创建静态库并使用 Makefile 进行链接

C: Creating static library and linking using a Makefile

我正在尝试 understand static and shared Libraries

我想执行以下操作来创建一个单独编译和链接的 makefile,以便创建和链接静态库 在形成最终的静态可执行文件时。

我有以下 Makefile 代码,但出现以下错误

Makefile:13: *** missing separator. Stop.

但我也在尝试了解如何实际 link/create 库。

如果我 运行 line 12 之后的命令在终端中有效,但在 makefile 中无效。

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o

main.o: main.c
    gcc -O -c -lm main.c main.h

addSorted.o: addSorted.c addSorted.h
    gcc -O -c -lm addSorted.c

freeLinks.o: freeLinks.c freeLinks.h
    gcc -O -c -lm freeLinks.c

ar rc libmylib.a main.o addSorted.o freeLinks.o    //Error Line

ranlib libmylib.a

gcc -o foo -L. -lmylib foo.o

clean:
    rm -f myProgram main.o addSorted.o freeLinks.o

另外,如果您能协助改进代码,我将不胜感激。

试试这个:

all: myProgram

myProgram: main.o libmylib.a #libmylib.a is the dependency for the executable
        gcc -lm -o myProgram main.o -L. -lmylib

main.o: main.c
        gcc -O -c main.c main.h

addSorted.o: addSorted.c addSorted.h
        gcc -O -c addSorted.c

freeLinks.o: freeLinks.c freeLinks.h
        gcc -O -c freeLinks.c

libmylib.a: addSorted.o freeLinks.o #let's link library files into a static library
        ar rcs libmylib.a addSorted.o freeLinks.o

libs: libmylib.a

clean:
        rm -f myProgram *.o *.a *.gch #This way is cleaner than your clean

这组规则首先编译所有文件,然后生成库 (libmylib.a) 目标并将其工件用于 link 可执行文件。 我还添加了单独的冗余目标形式,仅制作库。 需要的文件:

user@host> ls
addSorted.c  addSorted.h  freeLinks.c  freeLinks.h  main.c  main.h Makefile

makefile 不是 shell 脚本。这是一个配置文件 对于专家系统。特别是一个专家系统 知道,如果你告诉它,如何有效地创建文件及其 最少重新制作不需要的文件的依赖项 待重制。

如果您查看第一条规则:

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o

告诉系统如何创建一个名为 "myProgram" 的文件,如果它 决定它需要这样做。冒号后的部分 是 myProgram 需要的文件。如果他们不在,或者 make 决定它们已经过时,make 将尝试找到一些 可用于创建或更新它们的配方。一次 所有这些都完成了,然后 make 执行 "gcc ..." 行并且 假定将创建或更新 myProgram。

您的 ar 和 ranlib 行与所需的语法不匹配 生成文件规则。从他们的外表来看,他们似乎是 libmylib.a 的制作方法。如果你把它们放入 语法 make 需要这样说,你得到:

libmylib.a: main.o addSorted.o freeLinks.o
    ar rcu libmylib.a main.o addSorted.o freeLinks.o
    ranlib libmylib.a

myProgram 应该依赖于库本身,而不是 库的内容,最好把库选项放在 结束:

myProgram: libmylib.a
    gcc -o myProgram libmylib.a -lm

如果你愿意,你可以使用一个选项来告诉 gcc 寻找库 在当前目录中:

gcc -L. -o myProgram main.o -lmylib -lm

还有makefile变量可以帮你不用重复 这么多,所以我会把第一条规则写成:

myProgram: libmylib.a
    gcc -L. -o $@ -lmylib -lm

然而,main.o 不太可能真正成为图书馆的一部分, 所以:

myProgram: main.o libmylib.a
    gcc -L. -o $@ $< -lmylib -lm

图书馆规则为:

libmylib.a: addSorted.o freeLinks.o
    ar rcu $@ $+
    ranlib $@

这里的$+表示"all of the dependency file names".

最后,如果你想让 gcc 生成一个实际的静态可执行文件,而不是 只需使用您创建的库,您需要传递“-static”选项 到 gcc。