我的目標是創建一個由C++創建的共享庫。我想從C程序中調用該庫中的函數調用共享.so中的函數C
我有一個compareImage.h:
#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(){
..
}
我已經創建一個共享庫使用這個命令:
g++ -ggdb `pkg-config --cflags opencv` -fpic -shared compareImage.cpp -o libcompareImage.so `pkg-config --libs opencv`
然後,我寫ac程序來調用compareTwoImages()f恩膏從共享庫這樣的:
#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
所以我不知道是什麼問題是。
的問題是,你是不是與你共享庫鏈接程序。僅僅因爲在你的硬盤上有一些文件,使用你的代碼使用的函數,並不意味着編譯器會自動知道它在哪裏。您必須顯式鏈接該共享庫(並確保它在共享庫搜索路徑中,在運行時)。請參閱'ld(1)''''''''''l'''文件,您可以通過gcc傳遞。 –
其中之一,庫-lcompareImage應該在c_call_cpp.c之後。 –
謝謝Sam和Anon。我的錯誤是把它放在c_call_cpp.c之前的-lcompareImage,它現在可以工作。 –