我使用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_PATH
,LD_LIBRARY_PATH
,我的PATH
等,但似乎没有任何效果。我已经在网上看了,但找不到任何东西。这些路径设置在哪里?
感谢。
答案 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。