查找损坏的 C++ link 错误

Finding mangled C++ link error

此项目中有两个 link 错误。

首先,@Steve 指出,缺乏 void *__gxx_personality_v0;

如果有人能解释一下为什么在cygwin下用clang++3.5编译的C++项目会创建一个对此的引用,我想明白了。无论如何,我将符号定义为解决方法。

另一个问题似乎是对 64 位中 32 位相对寻址的引用。我正在寻找一种方法来告诉 clang++ 编译 32 位或 64 位。我也会尝试原生 linux,但是再次强调,如果有人能解释为什么会这样,我想理解。

我认为它可能是一个静态变量,位于地址 space 的低位,被堆栈上的某些东西访问,但是据我所知,clang 正在生成所有内容,这是编译器中的错误。

clang++ -std=c++11 -O2 -g -I include/ -pthread -c RequestHandler.cc
clang++ -std=c++11 -O2 -g Config.o Logger.o RequestHandler.o FileSys.\
o Buffer.o server.o CspServlet.o -pthread -o server
RequestHandler.o:fake:(.debug_info+0x54bd): relocation truncated to f\
it: R_X86_64_32 against `.debug_ranges'
...
FileSys.o:fake:(.eh_frame$_ZNSt10_HashtableISsSt4pairIKSsP2FLESaIS4_E\
NSt8__detail10_Select1stESt8equal_toISsESt4hashISsENS6_18_Mod_range_h\
ashingENS6_20_Default_ranged_hashENS6_20_Prime_rehash_policyENS6_17_H\
ashtable_traitsILb1ELb0ELb1EEEE21_M_insert_unique_nodeEmmPNS6_10_Hash\
_nodeIS4_Lb1EEE+0x13): undefined reference to `__gxx_personality_v0'
FileSys.o:fake:(.eh_frame$_ZNSt8__detail16_Hashtable_allocISaINS_10_H\
ash_nodeISt4pairIKSsP2FLELb1EEEEE16_M_allocate_nodeIJRKS6_EEEPS7_DpOT\
_+0x13): more undefined references to `__gxx_personality_v0' follow
collect2: error: ld returned 1 exit status

好的,原来在cygwin上,当我安装clang时,它并没有完全使用clang工具链。 clang 正在编译,但 g++ 正在 linking(我认为)。请记住,所有这些工具都可能被别名为其他东西,但这是非常可疑的。

我在 Unix 上构建并且它运行良好。相同的生成文件。 所以问题是,当我写 clang 时,它并没有使用 clang 到 link。这很奇怪。