[英]C: Creating static library and linking using a 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的秘诀。 如果你把它们放入语法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 $@
$ +这里表示“所有依赖文件名”。
最后,如果你想让gcc创建一个实际的静态可执行文件,而不只是使用你创建的库,你需要将'-static'选项传递给gcc。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.