C:使用Makefile创建静态库和链接

我试图了解静态和共享库 。

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

我有Makefile的以下代码,但我收到以下错误

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

但我也试图了解如何实际链接/创建库。

如果我在终端中的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)成为目标,并使用它的工件链接可执行文件。 我还添加了单独的冗余目标表单,仅制作库。 需要的文件:

 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会执行“gcc …”行并假定将创建或更新myProgram。

您拥有的ar和ranlib行与makefile规则所需的语法不匹配。 从它们的外观来看,它们似乎是制作libmylib.a的秘诀。 如果你把它们放入语法中需要说出来,你会得到:

 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 $@ 

$ +这里表示“所有依赖文件名”。

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