[英]Linking static library with -l flag
如何使用-l标志编译makefile?
我有一个看起来像的makefile
myLibrary:
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
我收到一个错误。 两个都不应该一样吗?
这是一个基本的,不切实际的makefile,它将使静态库libmyLibary
成为程序main
,它将使用-L
(库搜索路径)和-l
(库)选项与静态库链接。
Makefile文件
.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
告诉链接器在/path/to/search
您使用-l
选项指定的任何库,然后在其默认搜索目录中查找它们。 当前目录, .
,不是链接器的默认搜索目录之一。 因此,如果您希望它在当前目录中找到使用-l
选项指定的库,则需要指定-L.
-lfoo
告诉链接器按照您指定的顺序,首先在-L
目录中搜索动态库libfoo.so
或静态库libfoo.a
,然后在其默认搜索目录中搜索。 如果在其中一个搜索目录中找到libfoo.so
或libfoo.a
,它会立即停止搜索。 如果它发现他们都在同一个目录,然后默认情况下它会链接libfoo.so
与您的程序,而不是链接libfoo.a
。
要纯粹链接静态库,请使用-static,Like
gcc -static main.c libmyLibrary.a
并运行可执行文件./a.out
GCC Linux。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.