Clang ++を使用して共有オブジェクトを構築します。主な機能は 'extern' C ''ブロックにあります。建物は問題なく、JNAを使ってこれらの関数を呼び出すことができます。私は "-lstdC++"(いくつかのC++ 11の機能を利用するための)フラグを追加するとClang ++は、-lstdC++を使用した場合、extern "C"の名前を変更します。
- 私は、ランタイムエラーを得た:
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 [email protected]@GLIBCXX_3.4.11
000000000026b920 b _ZStL8__ioinit
000000000026b9e0 b _ZStL8__ioinit
0000000000004508 T _init
0000000000021000 T init
私はそれを修正するために何ができますか?
'std :: string'を使用しました。これはC++オブジェクトです。あなたは ''それをextern ""できません。 –
@RichardHodgesはい、extern C宣言でC++オブジェクトを使用できますが、extern "C"はリンケージにのみ関係します。 '-stdlib = libstdC++ -static -lstdC++'を使って静的にリンクすることでこれを修正できるかどうかは確かですが、これは少なくともdepencyを解決するものです。しかし静的なリンケージが正しい解決策であるかどうかはわかりません。 –