当使用-lstdc ++时,Clang ++确实使用extern“C”命名

时间:2016-09-14 08:56:27

标签: c++ c++11 jna clang++ llvm-clang

我使用Clang ++构建一个共享对象。主要功能位于'extern“C”'区块。建筑很好,我可以使用JNA调用这些功能。

当我添加标志“-lstdc ++”(用于使用某些C ++ 11功能)时 - 我遇到了运行时错误:

undefined symbol: _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm

我跑

nm target/classes/linux-x86-64/libCloudCryptoLibrary.so  |grep init

然后我得到

                 U _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm
                 U _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc
0000000000004860 T _init
0000000000024360 T init

当我删除该标志并再次运行nm时,我得到:

                 U _ZNKSt5ctypeIcE13_M_widen_initEv@@GLIBCXX_3.4.11
000000000026b920 b _ZStL8__ioinit
000000000026b9e0 b _ZStL8__ioinit
0000000000004508 T _init
0000000000021000 T init

我能做些什么来纠正它?

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方案: 我有一个名为" init"在外部" C"阻止(你可以看到线" 0000000000021000 T init")。 我将其重命名为" initMyClass"问题消失了。