2012-12-26 15 views
9

biegnę ..gcc niezdefiniowana odniesienia do

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

i dostaję następujący błąd ...

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 

i TTSRequestFile jest w lib nagłówka, ale ma na dllexport przód tego, o który się zastanawiam, jest przyczyną mojego błędu? Każda pomoc doceniona.

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

Odpowiedz

21

Twoje polecenie połączenia jest nieprawidłowe. Biblioteki należy podać na końcu polecenia:

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

Udało się, dziękuję !!! – JLB

+0

Czy są jakieś pomysły na błąd podczas uruchamiania pliku wykonywalnego? błąd podczas ładowania bibliotek współdzielonych: -melf_x86_64: nie można otworzyć pliku obiektu współdzielonego: brak takiego pliku lub katalogu – JLB

+1

@JLB Ponieważ biblioteka nie znajduje się w katalogu przeszukiwanym domyślnie przez program ładujący środowisko wykonawcze. Musisz umieścić bibliotekę w przeszukiwanym katalogu (jak/usr/local/lib) lub wyeksportować zmienną środowiskową LD_LIBRARY_PATH, aby uwzględnić katalog, w którym znajduje się biblioteka (np. LD_LIBRARY_PATH = "/ home/me/mylib"), lub chciałbyś połączyć swój program za pomocą ścieżki rpath, która wskazuje katalog, w którym znajduje się biblioteka, lub użyć funkcji $ ORIGIN rpath, aby zawsze szukać biblioteki w katalogu o ścieżce względnej do pliku wykonywalnego. Wyszukaj w Google hasło "pochodzenia rpath", aby uzyskać więcej informacji na jego temat. –

0

Można dodać preprocesor ifdefines wokół rozmowy DllExport tak:

#ifdef _WIN32 
// we are on windows 

#elif defined __linux__ 
//we are on linux 

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

#endif // os specific 

dodałem dla trzech platform I zostały zbierające platformę Krzyż. Zauważ, że słowa kluczowe, których używam do rozpoznawania platform, mogą się zmienić, ale test został przeprowadzony z Windows 7 i 8. Znalazłem je rok temu na sourceforge. Nie mogłem znaleźć strony teraz, ale skontaktuję się z Tobą, jeśli ją znajdę.

Ponieważ nie mogę jeszcze skomentować odpowiedzi Nikos C, będę ją komentować tutaj: Twoje polecenie linku jest poprawne, nie mogę oczywiście zobaczyć twoich plików, więc zakładam, że twoje ścieżki są poprawne. Co jest ważne, to, że -l musi być w poprawnej kolejności zgodnie z zależnościami, ale zazwyczaj nie stanowi to problemu, o ile doświadczyłem.

Powiązane problemy