Makefile中程式链接的静态库、共享库同样也能有目录搜索得到。这一特性需要我们在书规则的依赖是指定一个类似“-lNNAM”的依赖文件名(一个奇怪的依赖文件名!一般依赖文件名应该是个普通文件的名字。库文件的命名也应该是“libNAME.a”而不是所写的“-lNAME”。这是为什么,熟悉GNU
ld的话我想这就不难理解了,“-lNAME”的表示方式和ld的对库的引用方式完全相同,只是我们在书写Makefile的规则时使用了这种书写方式。因此你不应该感到奇怪)。下边我们就来看看这种奇怪的依赖文件到底是什么。
当规则中依赖文件列表中存在一个“-lNAME”形式的文件时。make将根据“NAME”首先搜索当前系统可提供的共享库,如果当前系统不能提供这个共享库,则搜索他的静态库(当然你能在命令行中指定编译或连接选项来指定动态连接还是静态连接,这里我们不讨论)。来看一下周详的过程。1.
make在执行规则时会在当前目录下搜索一个名字为“libNAME.so”的文件;2.
如果当前工作目录下不存在这样一个文件,则make程式会继续搜索使用“VPATH”或“vpath”指定的搜索目录。3.
还是不存在,make程式将搜索系统默认目录,顺序是:“/lib”、“/usr/lib”和“PREFIX/lib”(在Linux系统中为“/usr/local/lib”,其他的系统可能不同)。
如果“libNAME.so”通过以上的途径最后还是没有找到的话,那么make程式将会按照以上的搜索顺序查找名字为“libNAME.a”的文件。
假设你的系统中存在“/usr/lib/libcurses.a”(不存在“/usr/lib/libcurses.so”)这个库文件。看一个例子:
foo
: foo.c -lcurses
cc $^ -o
$@
上例中,如果文件“foo.c”被修改或“/usr/lib/libcurses.a”被更新,执行规则时将使用命令“cc
foo.c /usr/lib/libcurses.a -o
foo”来完成目标文件的重建。需要注意的是:如果“/usr/lib/libcurses.a”需要在执行make的时生成,那么就不能这样写,因为“-lNAME”只是告诉了链接器在生成目标时需要链接那个库文件。上例的中的“-lcurses”并没有告诉make程式其依赖的库文件应该怎么重建。当搜索的所有目录中不存在库“libcurses”时。Make将提示“没有规则能创建目标“foo”需要的目标“-lcurses”。如果在执行make时,出现这样的提示信息,你应该明确发生了什么错误,而不要因为错误而不知所措。
当规则的依赖列表中出现了“-lNAME”格式的依赖,默认搜索的文件名为“libNAME.so”和“libNAME.a”,这是由变量“.LIBPATTERNS”来指定的。“.LIBPATTERNS”的值一般是多个包含模式字符(%)的字(一个不包含空格的字符串),多个字之间使用空格分开。在规则中出现“-lNAME”格式的的依赖时,首先使用这里的“NAME”代替变量“.LIBPATTERNS”的第一个字的模式字符(%)而得到第一个库文件名,根据这个文件名在搜索目录下查找,如果能够找到、就是用这个文件,否则使用“NAME”代替第二个字的模式字符,进行同样的查找。默认情况时,“.LIBPATTERNS”的值为:“lib%.so
lib%.a”。这也是默认情况下在规则存在“-lNAME”格式的依赖时,链接生成目标时使用“libNAME.so”和“libNAME.a”的原因。
变量“.LIBPATTERNS”就是告诉链接器在执行链接过程中对于出现“-LNAME”的文件怎么展开。当然我们也能将此变量制空,取消链接器对“-lNAME”格式进行展开。
1.5.6 库文件和搜索目录 .a .so
最新推荐文章于 2025-11-27 14:19:33 发布
本文详细解释了在Makefile中如何使用-l参数指定链接库,包括静态库和共享库的搜索路径及规则,并介绍了变量.LIBPATTERNS的作用。
7647

被折叠的 条评论
为什么被折叠?



