如何使用 -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
(库)选项。
生成文件
.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
告诉链接器搜索动态库 libfoo.so
或静态库
库,libfoo.a
,首先在您的 -L
目录中,如果有的话,按照您的顺序
指定它们,然后在其默认搜索目录中。它停止搜索
只要在其中一个搜索目录中找到 libfoo.so
或 libfoo.a
。
如果它在同一目录中找到它们的 both ,那么默认情况下它将链接 libfoo.so
与
你的程序,而不是链接 libfoo.a
。
关于c - 使用 -l 标志链接静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42257463/