我正在尝试使用-l:/path/to/library
选项ld
来编译程序,但是在一台计算机上ld
设法找到该库,而在另一台计算机上却无法找到它。
我发现问题在于,在第二台计算机中,ld
将路径添加到给定路径的开头,但我不明白为什么会这样做。
有没有人有解决方案?
答案 0 :(得分:3)
-l
仅用于指定库的名称。例如。如果你写-lfoo
,gcc会查找libfoo:首先是动态版本,即libfoo.so
,如果找不到它,那么对于静态版本,即libfoo.a
。
包含路径是不。
但哪里 gcc然后找我的libfoo.so,你问?
它使用一些标准路径,在两台PC上可能有所不同,因此它可以在一台PC上工作,而在另一台PC上不工作。要建议更多库搜索路径,请使用参数-L
。它可以出现多次。
示例:gcc ... -lfoo -lbar -L/my/path/to/libraries1 -L/my/second/library/path
在标准搜索目录中查找libfoo.so
和libbar.so
(可能还有libfoo.a
和libbar.a
)以及< / em>自定义目录/my/path/to/libraries1
和/my/second/library/path
。
答案 1 :(得分:0)
ld
&#39; s -l选项的手册页说
如果namespec是形式 :filename,ld将在库路径中搜索名为filename的文件,否则它将在库路径中搜索名为libnamespec.a的文件。
这告诉我,:将尝试在库搜索路径中找到之后的路径。因此,路径被解释为相对于库搜索路径中的每个路径的路径。尝试在链接器语句中添加-L/
。这会将根目录添加到链接时搜索路径,然后链接器将在根目录中搜索-l:/path/to/library
,使其表现为绝对路径。
在每台计算机上使用ld --verbose | grep SEARCH
检查库搜索路径可能会为您提供一个工作原理而另一个不工作的线索。对我来说,库中没有/搜索目录结果,如果没有指定-L/
,我就无法链接到绝对路径。