如何使用-l标志编译makefile?
我有一个看起来像
的makefilemyLibrary:
gcc -c myLibrary.c -o myLibrary.o
ar cr libmyLibrary.a myLibrary.o
然后我用
编译我的主程序main:
gcc -g -c -o main.o main.c
gcc main.o -o main libmyLibrary.a
上面的makefile有效,但如果我想替换
libmyLibrary.a
-lmyLibrary
我收到错误消息。难道两者都不一样吗?
答案 0 :(得分:2)
这是一个基本的,不切实际的makefile,它将构成静态库libmyLibary
在它生成程序main
之前,它将与静态库链接
使用-L
(库搜索路径)和-l
(库)选项。
<强>生成文件强>
.PHONY: all clean
all: libmyLibrary.a main
main: main.o | libmyLibrary.a
$(CC) -o main main.o -L. -lmyLibrary
libmyLibrary.a: myLibrary.o
$(AR) rcs libmyLibrary.a myLibrary.o
clean:
rm -f *.o libmyLibrary.a main
的运行方式如下:
$ make
cc -c -o myLibrary.o myLibrary.c
ar rcs libmyLibrary.a myLibrary.o
cc -c -o main.o main.c
cc -o main main.o -L. -lmyLibrary
我想你知道,制作一个图书馆和一个程序是不现实的
在同一个makefile中与它链接,因为库的位置是
你不需要不断改造它以将它与许多程序联系起来。你真的有
libmyLibrary.a
的makefile和其他程序的makefile
用它。
这是gcc链接选项-L
和-l
的工作原理:
-L/path/to/search
告诉链接器查找您在-l
中使用/path/to/search
选项指定的任何库,
在它的默认搜索目录中查找它们之前。当前目录.
,
不是链接器的默认搜索目录之一。所以,如果你想要它
找到当前目录中使用-l
选项指定的库,然后您需要
指定-L.
-lfoo
告诉链接器搜索动态库libfoo.so
或静态库
库libfoo.a
,首先在-L
目录中,如果有的话,按照您的顺序排列
指定它们,然后在其默认搜索目录中。它停止搜索
只要在其中一个搜索目录中找到libfoo.so
或libfoo.a
。
如果它在同一目录中找到两者,则默认情况下它会将libfoo.so
与
您的计划,而不是libfoo.a
。
答案 1 :(得分:1)
要纯粹静态链接库,请使用-static,Like
gcc -static main.c libmyLibrary.a
并运行可执行文件./a.out
GCC Linux。