2017-04-04 87 views
-2

我的目標是創建一個由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 

所以我不知道是什麼問題是。

+0

的問題是,你是不是與你共享庫鏈接程序。僅僅因爲在你的硬盤上有一些文件,使用你的代碼使用的函數,並不意味着編譯器會自動知道它在哪裏。您必須顯式鏈接該共享庫(並確保它在共享庫搜索路徑中,在運行時)。請參閱'ld(1)''''''''''l'''文件,您可以通過gcc傳遞。 –

+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.

相關問題