2017-04-04 5 views
-2

Mein Ziel ist das Erstellen einer gemeinsam genutzten Bibliothek aus C++ erstellt. Und ich möchte aus einem C-Programm in der Bibliothek eine Funktion aufzurufenRufen Sie eine Funktion in shared .so von C

Ich habe einen compareImage.h:

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

EXTERNC int compareTwoImages(); 

#undef EXTERNC 

und eine compareImage.cpp Datei:

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

ich bereits erstellt haben eine gemeinsam genutzte Bibliothek mit diesem Befehl:

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

Dann schreibe ich ac Programm compareTwoImages() aufzurufen, f Salbung von diesem gemeinsamen lib wie folgt aus:

#include <stdio.h> 

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

    return 0; 
} 

und kompilieren Sie es mit diesem Befehl:

gcc -lcompareImage c_call_cpp.c -o callCpp.o 

Aber es zeigt einen Fehler:

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

Ich weiß also nicht, was die Das Problem ist.

+0

Das Problem ist, dass Sie nicht Ihr Programm mit Ihrer gemeinsam genutzten Bibliothek verknüpfen. Nur weil irgendwo auf der Festplatte eine Datei ist, mit der Funktion, die der Code benutzt, bedeutet das nicht, dass der Compiler automatisch weiß, wo er ist. Sie müssen explizit mit dieser gemeinsam genutzten Bibliothek eine Verbindung herstellen (und sicherstellen, dass sie sich zur Laufzeit im Suchpfad der gemeinsam genutzten Bibliothek befindet). Siehe 'ld (1)' 's Dokumentation für die Option '-l', die Sie über gcc weitergeben können. –

+1

Zum einen sollte die Bibliothek -lcompareImage nach c_call_cpp.c kommen. –

+0

Danke Sam und Anon. Mein Fehler ist -lcompareImage vor c_call_cpp.c, Es funktioniert jetzt. –

Antwort

1

Das Problem ist nicht mit C++ oder mit Ihrer gemeinsam genutzten Bibliothek oder etwas ähnliches.

Beschränken Sie Ihr Problem beim nächsten Mal auf ein einfaches Beispiel.

Hier einfach Sie den Link Flagge an der falschen Stelle gesetzt:

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

Es braucht nach das Objekt zu gehen, dass ihre Symbole verwenden werden.

gcc c_call_cpp.c -o callCpp.o -lcompareImage 

Dies ist deutlich in the documentation for -l angegeben:

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.