【发布时间】:2016-11-18 18:20:24
【问题描述】:
ld 行为怪异,我想了解发生了什么。在mycode.cpp 中,我有以下内容:
#include <algorithm>
#include "mycode.hpp"
// awesome stuff here
我用g++ -fPIC -c mycode.cpp 编译它并用ld -Bshareable -o libmylib.so mycode.o 链接它。像魅力一样工作。
然后我想在mycode.cpp 中调用cout。实际上,即使在添加 cout 之前,如果我只是在上面的代码中添加 #include <iostream>,在链接时我就会收到错误
mycode.o: In function `__static_initialization_and_destruction_0(int, int)':
mycode.cpp:(.text+0x50): undefined reference to `__dso_handle'
ld: mycode.o: relocation R_X86_64_PC32 against undefined hidden symbol `__dso_handle' can not be used when making a shared object
ld: final link failed: Bad value
如果我将它与g++ -shared 链接,它可以工作,但这不是重点。我不明白这里出了什么问题,我正在寻找见解。
编辑:我知道必须直接调用g++ 而不是ld。我的问题是,我想了解引擎盖下的内容:为什么在算法已经存在时包含 iostream 会破坏事物(所以ld 知道 stdc++)
【问题讨论】:
-
很确定你的答案就在那里:Using only g++ works, but not “g++ -c” and ld
-
请参阅linuxquestions.org/questions/programming-9/…,但请注意它适用于非常旧的 gcc 版本
-
不要直接调用ld。与 GCC 链接。