无法链接包含iostream的动态库

时间:2016-11-18 18:20:25

标签: c++ linker g++ ld

ld表现得非常奇怪,我想了解发生了什么。在mycode.cpp中,我有以下内容:

#include <algorithm>
#include "mycode.hpp"

// awesome stuff here

我使用g++ -fPIC -c mycode.cpp对其进行编译,并将其与ld -Bshareable -o libmylib.so mycode.o相关联。像魅力一样。

然后我想在cout中致电mycode.cpp。实际上,即使在添加此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 ++)

1 个答案:

答案 0 :(得分:2)

  

将其与ld -Bshareable -o libmylib.so mycode.o相关联。像魅力一样。

它只能偶然

用户级代码应该从不直接与ld链接,并且始终使用适当的编译器驱动程序(此处为g++)来执行链接。还有别的,你会因为奇怪的链接时间或运行时错误而失败(就像你在这里做的那样)。