2016-12-29 15 views
1

.soファイルを作成し、main.cppファイルが.soファイルから関数を呼び出せるようにします。についてLinuxの.soファイルはmain.cppファイルにリンクできません

これは私のファイルです。

//aa.h 
#include <stdio.h> 
#include <stdlib.h> 
void hello(); 

//hola.c 
#include <stdio.h> 
#include "aa.h" 
void hello() 
{printf("Hello world!\n");} 

//main.cpp 
#include "aa.h" 
void hello(); 
int main(){hello();return 0;} 

これは、以下のステップです。

ステップ1:作成する.soファイル

$ gcc hola.c -fPIC -shared -o libhola.so 

それが動作

ステップ2:MAIN.CPPするlibhola.soをリンクし、テスト

$ gcc main.cpp -L. -lhola -o test 

と呼ばれる実行ファイルを作成しますちょうど私が何を試したか2つのステップ。

、エラーが言う:

main.cpp:(.text+0x12): undefined reference to `hello()' 
collect2: error: ld returned 1 exit status 

Iは、/ usr/libにlibhola.soを移動して、/ usr/incluedのが、動作しないためにaa.hを移動することが試みられていました。

+0

私は右だ場合は、ヘッダファイルを '#ifndefのSOME_NAME の#define SOME_NAME が含まれている必要があり//は #1 endif' – Shravan40

+1

は、C++言語は、戻り値の型とパラメータの型を含めるために、すべての関数名を狂わせる何かをします。 C言語はそれをしません。 'gcc'コンパイラはC++コードをコンパイル/リンクするためのものではありません。代わりに 'g ++'や 'gpp'を使います。ライブラリの関数 'hello'を扱うためのC++メインプログラムを入手するには、ライブラリのヘッダーファイルに、' hello'関数のプロトタイプを囲む '#ifdef cplusplus {....}が必要です。 'hello'のプロトタイプはヘッダファイルにありますので、' main.c'ファイルでそのプロトタイプを繰り返さないでください。 – user3629249

+0

cmd promptから 'ldconfig'を呼び出してください。また、 'ldconfig -p | grep "hola" 'は結果を返します。 – sameerkn

答えて

2

共有ライブラリをCファイル(具体的にはhello()関数)としてコンパイルしていますが、C++ソースのコンパイル中に共有ライブラリをリンクしています。 C++実行可能ファイルからhello()(つまりname mangledではなく)を呼び出せるようにする必要があります。あなたのヘッダーaa.h

すなわち追加extern "C":私はあまりにもinclude guardを追加することをお勧めしたい

#ifdef __cplusplus 
extern "C" { 
#endif 
void hello(); 

#ifdef __cplusplus 
} 
#endif 

また、main.cppの名前をmain.cに変更すると、これがなくてもうまくコンパイルできます。

関連する問題