ld搜索格式错误的目录路径

时间:2016-04-27 02:09:13

标签: c linux bash ld

我使用ld链接到我的文件系统上的库。

当我运行命令ld -verbose -lmylib时,我得到以下回复:

attempt to open /usr/x86_64-linux-gnu/lib64/libmylib.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libmylib.a failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libmylib.so failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libmylib.a failed
attempt to open //usr/local/lib64/libmylib.so failed
attempt to open //usr/local/lib64/libmylib.a failed
attempt to open //lib/x86_64-linux-gnu/libmylib.so failed
attempt to open //lib/x86_64-linux-gnu/libmylib.a failed
attempt to open //lib64/libmylib.so failed
attempt to open //lib64/libmylib.a failed
attempt to open //usr/lib/x86_64-linux-gnu/libmylib.so failed
attempt to open //usr/lib/x86_64-linux-gnu/libmylib.a failed
attempt to open //usr/lib64/libmylib.so failed
attempt to open //usr/lib64/libmylib.a failed
attempt to open //usr/local/lib/libmylib.so failed
attempt to open //usr/local/lib/libmylib.a failed
attempt to open //lib/libmylib.so failed
attempt to open //lib/libmylib.a failed
attempt to open //usr/lib/libmylib.so failed
attempt to open //usr/lib/libmylib.a failed
ld: cannot find -lmylib

我很困惑为什么要尝试打开前缀为//的文件。我的另一台电脑不是这种情况。我尝试过更改LIBRARY_PATHLD_LIBRARY_PATH,我的PATH等,但似乎没有任何效果。我已经在网上看了,但找不到任何东西。这些路径设置在哪里?

感谢。

1 个答案:

答案 0 :(得分:1)

此处的问题是您尝试链接库mylib,但此库不在系统的库搜索路径中,或者根本不存在。请你把它放在正确的位置。如果库位于库搜索路径中不在的另一个目录中,则可以使用-L选项将其添加到ld,例如ld -verbose -L<the directory> -lmylib

至于你看到的双斜杠,这不是问题,因为在Linux上将多个斜杠解释为一个斜杠,也就是说,//foo/bar与/ foo /相同吧`,所以不用担心。

至于搜索路径的差异,在Fedora上,默认搜索路径为:

SEARCH_DIR("/usr/x86_64-redhat-linux/lib64"); SEARCH_DIR("/usr/lib64"); SEARCH_DIR("/usr/local/lib64"); SEARCH_DIR("/lib64"); SEARCH_DIR("/usr/x86_64-redhat-linux/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");

在Ubuntu上,它是:

SEARCH_DIR("/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");

所以Ubuntu用前缀&#39; =&#39;开始每个路径,现在让我们看看ld为此做了什么:

  

如果searchdir以&#34; =&#34;开头,那么&#34; =&#34;将被--sysroot选项控制的sysroot前缀替换,或者在配置链接器时指定。

这意味着=将被系统根取代,对于Linux系统来说,最像是/。这就是为什么你看到Ubuntu上的双斜线而不是Fedora。