2016-08-01 8 views
0

lib.cは含まれていますなぜ共有ライブラリをコンパイルした後に関数の名前が変わるのですか?

#include <stdio.h> 
void testFunction() 
{ 
    printf("This is the testFunction from lib.so"); 
} 

私は、このコマンドでファイルにコンパイル:私はtestFunctionが_Z12testFunctionvになったことがわかっlib.soにnmのrunned後

g++ -fPIC -shared lib.c -o lib.so 

を。どうして?私はdlsymを使って関数をロードする場合、これは大きな問題だと思います。

答えて

2

C++コンパイラg++を使用してCプログラムをコンパイルしました(小さなCコードは有効なC++コードです)。だから、あなたは何かを観察するname mangling。あなたはgccではなく(それは同じコンパイラスイートGCCの一部....である)を使用する必要があります

gcc -Wall -g -O -fPIC -shared lib.c -o lib.so 

(私は強くすべての警告を取得するために-Wallでコンパイルをお勧めします、と-gでデバッグ情報を取得します。あなたはdlopen & dlsymとC++を使用したい場合はを必ずお読みください

)フラグ-Oはオプション-itがmore-最適化する-O2ことができ、生成されたプラグインのパフォーマンスが向上する可能性がありますされ、最適化。

Invoking GCC

+0

C++コードではなくC++コードをコンパイルするのは、異なる役割を果たす 'g ++'で "動作"します。あなたのCコードは有効なC++コードでもあります。名前として 'testFunction'の代わりに' new'を使用した場合、ソースコードは 'new'がC++キーワードであるため、C++では有効ではありません(Cでは有効です)。 –

1

あなたは、「C++名前の符号化」を検索するには必要なドキュメントを読むことを忘れないでください。

引数タイプ以上は、コンパイラが生成する最終的な名前でエンコードされます。

(たとえば、Cというコンテキストから関数を呼び出し可能にしたい場合など)、extern "C"にする必要があります。

関連する問題