2011-10-31 24 views
0

linuxのC++ライブラリから関数を呼び出したい。私はそのライブラリの共有オブジェクトを持っています。 ydmgライブラリからintを返すgetAge()メソッドを呼び出す必要があります。続きLinuxのC++ライブラリからC++関数を呼び出す

は、私が書いたコードです:私はコンパイル

testydmg.cpp

#include "ydmg/bd.h" 
#include "yut/hash.h" 
#include "dlfcn.h" 

extern "C" int getAge(); 

class testydmg{ 
    public: 
     testydmg::testydmg(const yutHash& user){ 

     } 
     testydmg::testydmg(){ 

     } 

     testydmg::~testydmg(){ 

     } 


     int testydmg::getFunction(){ 
       void *handle; 
       int (*voidfnc)(); 
       handle = dlopen("ydmg.so",RTLD_LAZY); 
       if(handle == NULL){ 
         printf("error in opening ydmg lib"); 
       } else { 
         voidfnc = (int (*)())dlsym(handle, "getAge"); 
         (*voidfnc)(); 
         printf("class loaded"); 
       } 
       ydmgBd obj; 
       obj.getAge(); 
       printf("Inside getFunction()..."); 
       dlclose(handle); 

     } 
}; 

し、以下のようにコードをリンク:

gccの-fPIC -shared -l STDC++ -I/home/y/libexec64/jdk1.6.0/include -I/home/y/libexec64/jdk1.6.0/include/linux -I/home/y/include testydmg.cpp -o libTestYdmg.so libydmg.so

それから私は、新しい共有オブジェクトすなわちlibTestYdmg.so

nmの-C libTestYdmg.soで方法を確認してください| egrep getAge 上記のコマンドを実行しても何も得られません。

これは、ライブラリからgetAge()メソッドを取得しなかったことを意味しますか? 私が間違っている場所を修正してください。

+0

私はそこにライブラリが表示されますか? getAgeは未解決/遅延シンボルのままです。 –

答えて

2

ydmgDB::getAge()を使用しますが、getAge()のライブラリに依頼しています。これは正しくありません。単にydmgDBオブジェクトを作成し、コンパイルコマンドラインにリンクされているライブラリをロードせずにそのオブジェクトのメソッドgetAge()を呼び出してください。

ライブラリをdlopenする必要はありません。

さらに、getAgeは実際にlibTestYdmg.soに含まれていません。サンプルコードといくつかの可能性が重要な 警告を含んでいる、あなたが実際にC++コードにdlopenを使用してに興味があるなら、 C++ dlopen mini HOWTOを見てみましょう

nm -C libydmg.so | grep getAge 
+0

ありがとうございました.. – Garshita

1

を:あなたが使用してlibydmg.soでそれを見なければなりません。