Clang++ 在使用 -lstdc++ 时尽管有外部"C",但名称重整

Clang++ does name mangling inspite of extern "C" when using -lstdc++

本文关键字:外部 -lstdc++ Clang++      更新时间:2023-10-16

我使用clang++构建了一个共享对象。主要函数位于extern"C"块中。该建筑很好,我可以使用JNA调用这些函数。

当我添加了标志"-lstdc++"(用于使用一些c++ 11特性)-我得到了运行时错误:

undefined symbol: _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm

I run

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

我能做些什么来纠正它?

我找到了一个解决方案:我在外部"C"块中有一个名为"init"的函数(正如您可以看到的"0000000000021000 T init"行)。我把它重命名为"initMyClass",问题消失了。