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 ++)
答案 0 :(得分:2)
将其与
ld -Bshareable -o libmylib.so mycode.o
相关联。像魅力一样。
它只能偶然 。
用户级代码应该从不直接与ld
链接,并且始终使用适当的编译器驱动程序(此处为g++
)来执行链接。还有别的,你会因为奇怪的链接时间或运行时错误而失败(就像你在这里做的那样)。