2017-04-04 12 views
-2

私の目標は、C++から作成された共有ライブラリを作成することです。Cの共有.soの関数を呼び出す

#ifdef __cplusplus 
#define EXTERNC extern "C" 
#else 
#define EXTERNC 
#endif 

EXTERNC int compareTwoImages(); 

#undef EXTERNC 

とcompareImage.cppファイル:

#include "SURF_Homography.h" 
extern "C" int compareTwoImages(){ 
    .. 
} 

私はすでに作成していると私はcompareImage.hを持つCプログラム

からそのライブラリ内の関数を呼び出したいです

g++ -ggdb `pkg-config --cflags opencv` -fpic -shared compareImage.cpp -o libcompareImage.so `pkg-config --libs opencv` 

次に、compareTwoImages()fを呼び出すためのacプログラムを作成します

#include <stdio.h> 

int main() { 
    /* my first program in C */ 
    int test = compareTwoImages(); 
    printf("Comparison Results: %d\n", test); 

    return 0; 
} 

と、このコマンドでそれをコンパイルします:このようなもの共有ライブラリから慰め

gcc -lcompareImage c_call_cpp.c -o callCpp.o 

しかし、それはエラーを示しています

/tmp/cc0wuZTU.o: In function `main': 
c_call_cpp.c:(.text+0xe): undefined reference to `compareTwoImages' 
collect2: error: ld returned 1 exit status 

だから私は何を知りません問題はです。

+0

問題は、あなたの共有ライブラリを使用してプログラムをリンクしていないということです。あなたのハードドライブのどこかにファイルがあり、あなたのコードが使用する関数があるからといって、コンパイラがどこにあるのかを自動的に知るわけではありません。その共有ライブラリと明示的にリンクする必要があります(実行時に共有ライブラリ検索パスにあることを確認してください)。 '-l'オプションについては' ld(1) 'のドキュメントを参照してください。これはgccで渡すことができます。 –

+1

1つの場合、ライブラリ-lcompareImageはc_call_cpp.cの後に来る必要があります。 –

+0

SamとAnonに感謝します。私の間違いは、c_call_cpp.cの前に-lcompareImageを置くことです。今すぐ動作します。 –

答えて

1

問題はC++や共有ライブラリなどでは発生しません。

次に問題を簡単な例に絞り込みます。

ここでは、単に間違った場所にリンクフラグを置く:

gcc -lcompareImage c_call_cpp.c -o callCpp.o 
# ^^^^^^^^^^^^^^ 

それはその記号を使用しますオブジェクトの後に行く必要があります。

gcc c_call_cpp.c -o callCpp.o -lcompareImage 

これは明らかにthe documentation for -lに記載されています

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, ‘ foo.o -lz bar.o ’ searches library ‘ z ’ after file foo.o but before bar.o . If bar.o refers to functions in ‘ z ’, those functions may not be loaded.

関連する問題