linux – 为什么-r选项(可重定位)使ld找不到任何库?
使用GNU ld 2.21运行Debian /
Linux x86_64.
很简单,如果我链接 ld -o main main.o /usr/lib/crti.o /usr/lib/crt1.o /usr/lib/crtn.o -lc -lm 它有效,但是当我链接时 ld -r -o main1.o main.o /usr/lib/crti.o /usr/lib/crt1.o /usr/lib/crtn.o -lc -lm 它抱怨 ld: cannot find -lc ld: cannot find -lm 我实际上并没有尝试以这种方式编译代码,而是我试图弄清楚为什么别人的测试看看库是否存在无效. (因此我真的不明白ld发生了什么……通常我只是用GCC来链接) 为什么告诉ld以可重定位的方式链接使它突然无法找到库?如果我只是想测试-lm存在,我还应该做些什么 ld -r -lm 这样它会找到图书馆吗? 如果你想查看我正在处理的源代码,你可以在这里下载它:https://github.com/jeremysalwen/ESPS(注意,第一次提交是原始源代码,后续提交是我个人所做的更改.) 解决方法
MacOS X.
在MacOS X上,ld的手册页非常清楚-r选项:
因此,如果您使用的是MacOS X,那么问题是-lm不是Mach-O目标文件,也不是-lc.但是,从理论上讲,如果你有对象文件main.o,obj1.o和obj2.o并且你这样做: cp obj1.o ./-lm cp obj2.o ./-lc ld -r -o main1.o main.o -lm -lc 那它可能会奏效.在实践中,它没有,并且在你得到的错误中: ld: warning: unexpected dylib (/usr/lib/libm.dylib) on link line ld: warning: unexpected dylib (/usr/lib/libc.dylib) on link line 但是,运行: ld -r -o main1.o -arch x86_64 main.o obj1.o obj2.o 工作没有任何来自装载机的抱怨. Linux的 在Linux上,ld的手册页不那么明确,但是说:
在行之间读取,这也会获取目标文件并将它们转换为目标文件;它不会将库添加到组合中.如果考虑一下,就不会创建包含对库的引用的目标文件. 因此,尽管可能存在可以在使用-r选项时为链接器(加载器)指定库的平台,但还有其他不可用的平台. 解决方法 最初的问题是确定库是否存在.为什么不模仿autoconf的作用,并创建一个main.c,它优先包含对库中定义的符号的引用,但它可以简单地包含: int main(void){return 0;} 并编译并将其与C编译器链接: cc -o main main.c -lm -lc 如果它不起作用,则缺少其中一个库.如果您已经检查过-lc是否存在,那么您可以推断出缺少-lm. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |