私の目標は、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
だから私は何を知りません問題はです。
問題は、あなたの共有ライブラリを使用してプログラムをリンクしていないということです。あなたのハードドライブのどこかにファイルがあり、あなたのコードが使用する関数があるからといって、コンパイラがどこにあるのかを自動的に知るわけではありません。その共有ライブラリと明示的にリンクする必要があります(実行時に共有ライブラリ検索パスにあることを確認してください)。 '-l'オプションについては' ld(1) 'のドキュメントを参照してください。これはgccで渡すことができます。 –
1つの場合、ライブラリ-lcompareImageはc_call_cpp.cの後に来る必要があります。 –
SamとAnonに感謝します。私の間違いは、c_call_cpp.cの前に-lcompareImageを置くことです。今すぐ動作します。 –