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。
我正在尝试 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。