2009-06-12 18 views
2

Linuxで共有ライブラリを実装してテストしようとしましたが、「CEDD(char *) 'への未定義参照」というエラーが発生します。共有ライブラリ関数への未定義の参照

私は、次のパラメータを使用してEclipseを使用します。ファイル(ここではOK すべてがある)

  • ライブラリ と、その名前へのパスを含むように

    • パス。パスが正しいと 名前はWISE_C(フルネーム: libWISE_C.so)である

    マイコード:

    #include <iostream> 
    #include <Descriptor.h> 
    
    int main() { 
        char* path = "/export/home/pdmazubi3/workspace/proj1/src/pic.jpg"; 
        double * cedd = CEDD(path); ///// <-ERROR! 
    
        std::cout << "!!!Hello World!!!" << cedd[1]; 
        return 0; 
    
    } 
    

    ヘッダーDescriptor.h:私はテストのために使用

    テストプログラムの開発:

    double* CEDD(char* path); 
    

    望ましい機能を持つDescriptor.cの一部:

    #include "Descriptor.h" 
    #include "highgui.h" 
    #include "cv.h" 
    
    double* CEDD(char* path) 
    { 
        IplImage* srcImg; 
        IplImage* ImageGrid; 
    ... 
    } 
    

    私は何をしていますか?私はインターネットで多くの記事を暴言しましたが、解決策が見つかりませんでした。

    未定義の `CEDD(char *) 'はコンパイラまたはリンカのエラーですか?

  • 答えて

    2

    これはリンカーエラーです(通常は 'char *'ビットが含まれているとは思いませんが)ので、ライブラリが見つからないか、ライブラリに関数が含まれていないようです。後者は、実際の関数が含まれていても名前は異なることを意味する場合もあります。両方のプロジェクトがC++ではなくCとしてコンパイルされていることを確認してください。

    編集:私はあなたのプログラムがC++であることを忘れていました(詳細なリンカーメッセージについても説明しています)。この場合、extern "C"(条件付きで、C++を使用する場合のみ使用される)をCEDDの宣言に追加する必要があります。

    +1

    素晴らしい!あなたが正しいです!今私はCライブラリをテストするためにCプログラムを使用します。)しかし、ライブラリが接続されているとき(Paths)コンパイルされたバイナリファイルを取得しません(私もエラーは発生しません)。 libのすべてのパスを削除すると、出力に実行ファイルが得られます!どうすればいい? – user101375

    +0

    私は日食の経験がないし、エラーメッセージがなければ私は無知だ。おそらくあなたは何とか実行するコマンドのログを得ることができます。 – mweerden

    1

    ビルド時にdescriptor.c用に生成されたオブジェクトコードをリンクしてもよろしいですか?

    +1

    いいえ、わかりません。私はそれをする必要がありますか?私は* .soファイルとヘッダ* .hが必要だと思った。 – user101375

    +0

    内部にCEDDシンボルが定義されているように見てください。次に、.soファイルがリンクされていることを確認してください(残念ながら私はEclipseのエキスパートではなく、環境設定の詳細を提供しています...) –