2016-09-14 3 views
-1

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 

私はそれを修正するために何ができますか?

+5

'std :: string'を使用しました。これはC++オブジェクトです。あなたは ''それをextern ""できません。 –

+1

@RichardHodgesはい、extern C宣言でC++オブジェクトを使用できますが、extern "C"はリンケージにのみ関係します。 '-stdlib = libstdC++ -static -lstdC++'を使って静的にリンクすることでこれを修正できるかどうかは確かですが、これは少なくともdepencyを解決するものです。しかし静的なリンケージが正しい解決策であるかどうかはわかりません。 –

答えて

0

解決策を見つけました: extern "C"ブロックに "init"という名前の関数があります( "0000000000021000 T init"という行があります)。 私は "initMyClass"に名前を変更し、問題は消えます。

+0

オーバーロードを区別するために名前のマングリングが必要であるため、 'extern" C "'はオーバーロードされた関数では使用できません。ですから、この答えは意味があります: 'init'のオーバーロードを避けること。 – MSalters

関連する問題