2012-12-26 12 views
9

Ich bin mit ..gcc undefined reference to

gcc -c -I/usr/vt/sample ttssample.c 
gcc -L. -lttsapi ttssample.o -o ttsample 

und ich bekomme die folgende Fehlermeldung ...

ttssample.o: In function `_TTSFile': 
ttssample.c:(.text+0x352): undefined reference to `TTSRequestFile' 
ttssample.o: In function `_TTSFileEx': 
ttssample.c:(.text+0x5e0): undefined reference to `TTSRequestFileEx' 
ttssample.o: In function `_TTSBuffer': 
ttssample.c:(.text+0x833): undefined reference to `_TTSRequestBuffer' 
ttssample.o: In function `_TTSBufferEx': 
ttssample.c:(.text+0xabd): undefined reference to `_TTSRequestBufferEx' 
ttssample.o: In function `_TTSBuffering_cont': 
ttssample.c:(.text+0xcbf): undefined reference to `_TTSRequestBuffer' 
ttssample.o: In function `_TTSBuffering_stop': 
ttssample.c:(.text+0xf2d): undefined reference to `_TTSRequestBuffer' 
ttssample.o: In function `_TTSBuffering_SSML': 
ttssample.c:(.text+0x122b): undefined reference to `_TTSRequestBufferSSMLEx' 
ttssample.o: In function `_TTSStatus': 
ttssample.c:(.text+0x157b): undefined reference to `TTSRequestStatus' 
collect2: ld returned 1 exit status 

und TTSRequestFile im lib-Header, aber es hat Dllexport auf Die Vorderseite davon, die ich frage, ist die Ursache meines Fehlers? Jede Hilfe wird sehr geschätzt.

DllExport int TTSRequestFile(char *szServer, int nPort, char *pText, int nTextLen, char *szSaveDir, char *szSaveFile, int nSpeakerID, int nVoiceFormat); 

Antwort

21

Ihr Linkbefehl ist falsch. Bibliotheken sollten am Ende des Befehls angegeben werden:

gcc ttssample.o -o ttsample -L. -lttsapi
+0

Es funktionierte danke !!! – JLB

+0

Eine Idee, warum das Ausführen der ausführbaren Datei fehlschlagen würde? Fehler beim Laden gemeinsamer Bibliotheken: -melf_x86_64: Gemeinsame Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein Verzeichnis – JLB

+1

@JLB Da sich die Bibliothek nicht in einem Verzeichnis befindet, das standardmäßig vom Laufzeitladeprogramm durchsucht wird. Sie müssten die Bibliothek in ein gesuchtes Verzeichnis (wie/usr/local/lib) stellen oder die Umgebungsvariable LD_LIBRARY_PATH exportieren, um das Verzeichnis einzubeziehen, in dem sich die Bibliothek befindet (wie LD_LIBRARY_PATH = "/ home/me/mylib") Sie würden Ihr Programm mit einem rpath verknüpfen, der auf das Verzeichnis verweist, in dem sich die lib befindet, oder Sie verwenden die Funktion $ ORIGIN von rpath, um immer nach der lib in einem Verzeichnis mit einem relativen Pfad zu dem der ausführbaren Datei zu suchen. Durchsuchen Sie Google nach "rpath Herkunft", um mehr darüber zu erfahren. –

0

könnten Sie Präprozessor wie so ifdefines um den DllExport Anruf hinzufügen:

#ifdef _WIN32 
// we are on windows 

#elif defined __linux__ 
//we are on linux 

#elif defined __APPLE__&__MACH__ 
// we are on mac 

#endif // os specific 

ich für die drei Plattformen hinzugefügt Ich habe für Cross-Plattform wurde kompilieren. Beachten Sie, dass sich die Schlüsselwörter, die ich zur Erkennung von Plattformen verwende, ändern können, aber die _WIN32 wurde mit Windows 7 und 8 getestet. Ich habe diese vor einem Jahr auf sourceforge gefunden, denke ich. Ich konnte die Seite gerade nicht finden, aber ich werde mich an Sie wenden, wenn ich sie finde.

Da ich die Antwort von Nikos C noch nicht kommentieren kann, werde ich sie hier kommentieren: Ihr Linkbefehl ist korrekt, ich kann Sie natürlich nicht sehen, also nehme ich an, dass Ihre Pfade korrekt sind. Was ist wichtig ist, dass -l 's müssen in der richtigen Reihenfolge nach Abhängigkeiten, aber das ist in der Regel kein Problem, soweit ich erlebt habe.

Verwandte Themen