2016-09-05 28 views
2

我試圖編譯相關的書「高級編程的UNIX®環境」代碼的編譯過程中連接問題APUE相關的代碼

當我嘗試編譯測試文件,像這樣:

$ gcc -L ../lib/ -l apue foo.c 

我得到:

/tmp/cccXkUae.o: In function `main': 
foo.c:(.text+0x2b): undefined reference to `err_sys' 
... 
collect2: error: ld returned 1 exit status 

然而,似乎該功能在lib定義...

$ grep err_sys ../lib/libapue.a 
Binary file ../lib/libapue.a matches 

最終,這並不編譯沒有任何錯誤:

$ gcc foo.c ../lib/error.c 

只是想了解我在做什麼錯。

+1

的可能的複製(http://stackoverflow.com/questions/ [什麼是未定義參考/解析的外部符號錯誤,以及如何解決呢?] 12573816 /什麼是未定義的參考未解決的外部符號錯誤和怎麼辦我修復) – Olaf

+2

在鏈接器命令行上,總是把**庫後目標文件** - 總是! –

+0

感謝您幫助noob,@JonathanLeffler;你當然是對的。現在編譯就好了。 – mcede

回答

0

可用的源代碼 在http://www.apuebook.com/src.3e.tar.gz讓你(建成後)的標題名爲中的10和lib中的名爲libapue.a的靜態庫。因此,編譯和對libapue鏈接,您需要:

gcc -I $apue_root/include -L $apue_root/lib your_file.c -lapue 
+0

謝謝@PSkocik。我已經編譯了靜態庫...我應該提到這一點。我遇到的問題與'-lapue'在命令行中源文件後面的位置有關;你的答案清楚地表明瞭正確的格式。 – mcede

0

如果您使用的是靜態庫(如*.a文件在Linux上)鏈接,然後你可以做編譯你的程序是這樣的:

gcc foo.c ../lib/libapue.a 

如果你想將其與動態鏈接(共享)庫(例如,在Linux上*.a文件),那麼你可以使用你的建議的命令的命令:

gcc -L../lib/ foo.c -lapue 
+0

最好進入總是有效的習慣 - *對象(或源文件)之後的庫*。在某些系統上,在目標文件沒有_not_工作之前指定一個共享庫;該庫在當時不會滿足任何未定義的符號,因此在掃描完目標文件後不再進行查看。 –

+0

你是對的,我改變了我的答案。 – redneb