2016-06-28 14 views
1

Ich versuche Gnuplot_i, eine gnuplot Schnittstelle für ANSI-C, für mein C++ Projekt zu verwenden. (Siehe im Download-Bereich) Es scheint nur aus einem Header und einer Quelldatei zu bestehen. Da das Makefile nur eine Objektdatei erstellt, habe ich mich entschieden, diese beiden Dateien vollständig in mein Projekt zu integrieren. Allerdings bekomme ich Fehler von undefinierten Verweisen auf Funktionen, die in der oben genannten Quelldatei implementiert sind. Betrachten Sie das folgende vereinfachte Beispiel (main.cpp):undefined Verweis auf `gnuplot_init() '

#include <gnuplot_i.h> 
int main(int argc, char** argv) { 
    gnuplot_ctrl * h; 
    h = gnuplot_init(); 
    return 0; 
} 

Die Header-Datei here und die Quelldatei here erhalten werden kann.

Der Fehler ich erhalte, ist die folgende:

build/Debug/GNU-Linux/main.o: In function `main': 
/<some path>/proj/test/main.cpp:18: undefined reference to `gnuplot_init()' 
collect2: error: ld returned 1 exit status 

jedoch gnuplot_init() in der Quelldatei implementiert ist, die zu einer Objektdatei erstellt werden, die dann verwendet wird, um das Programm zu verknüpfen. Sie können dies im vollständigen Protokoll unten sehen. Auch die erzeugte Objektdatei enthält das notwendige Symbol:

$ nm gnuplot_i.o | grep gnuplot_init 
0000000000000000 T gnuplot_init 

vollständiges Protokoll:

cd '/<some path>/proj/test' 
/usr/bin/make -f Makefile CONF=Debug clean 
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf 
make[1]: Entering directory '/<some path>/proj/test' 
rm -f -r build/Debug 
rm -f dist/Debug/GNU-Linux/test 
make[1]: Leaving directory '/<some path>/proj/test' 

CLEAN SUCCESSFUL (total time: 52ms) 
cd '/<some path>/proj/test' 
/usr/bin/make -f Makefile CONF=Debug 
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf 
make[1]: Entering directory '/<some path>/proj/test' 
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux/test 
make[2]: Entering directory '/<some path>/proj/test' 
mkdir -p build/Debug/GNU-Linux 
rm -f "build/Debug/GNU-Linux/gnuplot_i.o.d" 
gcc -c -g -I. -MMD -MP -MF "build/Debug/GNU-Linux/gnuplot_i.o.d" -o build/Debug/GNU-Linux/gnuplot_i.o gnuplot_i.c 
gnuplot_i.c: In function ‘gnuplot_tmpfile’: 
gnuplot_i.c:696:5: warning: implicit declaration of function ‘close’ [-Wimplicit-function-declaration] 
    close(unx_fd); 
    ^~~~~ 
mkdir -p build/Debug/GNU-Linux 
rm -f "build/Debug/GNU-Linux/main.o.d" 
g++ -c -g -I. -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp 
mkdir -p dist/Debug/GNU-Linux 
g++  -o dist/Debug/GNU-Linux/test build/Debug/GNU-Linux/gnuplot_i.o build/Debug/GNU-Linux/main.o 
build/Debug/GNU-Linux/main.o: In function `main': 
/<some path>/proj/test/main.cpp:18: undefined reference to `gnuplot_init()' 
collect2: error: ld returned 1 exit status 
make[2]: *** [nbproject/Makefile-Debug.mk:64: dist/Debug/GNU-Linux/test] Error 1 
make[2]: Leaving directory '/<some path>/proj/test' 
make[1]: *** [nbproject/Makefile-Debug.mk:60: .build-conf] Error 2 
make[1]: Leaving directory '/<some path>/proj/test' 
make: *** [nbproject/Makefile-impl.mk:40: .build-impl] Error 2 

BUILD FAILED (exit value 2, total time: 304ms) 

Wie ich ein automatisch generierte Buildsystem von NetBeans dem Makefiles bin mit sind recht groß und komplex. Aber es sollte ziemlich offensichtlich aus dem Protokoll sein, welche Befehle ausgegeben wurden. Was ist hier genau falsch? Ist es ein Problem, dass ich C-Object-Dateien und C++ - Objektdateien verlinke? Aus meinem Verständnis sollte es nicht.

Antwort

2

Nun, die Antwort kam mir in dem Moment, als ich auf Senden drückte.

mir fehlt offensichtlich eine extern "C"

extern "C" { 
#include <gnuplot_i.h> 
} 
int main(int argc, char** argv) { 
     gnuplot_ctrl * h; 
    h = gnuplot_init(); 
    return 0; 
}