繁体   English   中英

使用-l标志链接静态库

[英]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.solibfoo.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM