2014-02-19 88 views
2

我試圖執行以下操作:未定義參考,但能正常工作在Mac

gcc -Ilibconfig controller.c -o Controller libconfig/libconfig.a 

但我得到的是:

In function `processConfigFile': 
controller.c:(.text+0x10e): undefined reference to `config_init' 
controller.c:(.text+0x132): undefined reference to `config_read_file' 
controller.c:(.text+0x169): undefined reference to `config_destroy' 
controller.c:(.text+0x188): undefined reference to `config_lookup_string' 
controller.c:(.text+0x1e0): undefined reference to `config_lookup_string' 
controller.c:(.text+0x269): undefined reference to `config_lookup_string' 
controller.c:(.text+0x2cc): undefined reference to `config_lookup_string' 
controller.c:(.text+0x317): undefined reference to `config_lookup_string' 
controller.c:(.text+0x36e): undefined reference to `config_lookup' 
controller.c:(.text+0x403): undefined reference to `config_setting_length' 
controller.c:(.text+0x454): undefined reference to `config_setting_get_string_elem' 
controller.c:(.text+0x4fa): undefined reference to `config_destroy' 
collect2: error: ld returned 1 exit status 

現在,我可以理解,鏈接器未能鏈接庫,但是我已經確定該庫是在文件之後出現的,這在OSX上工作得很好,我不知道爲什麼會發生這種情況。

請有人幫忙。

謝謝

+0

切換命令行參數的順序是否有幫助?即調用'gcc -Ilibconfig -o Controller libconfig/libconfig.a controller.c' – scai

+0

在Linux系統上從頭開始重建'libconfig/libconfig.a'?嘗試將OSX庫鏈接到Linux可執行文件可能會有點不可靠... – twalberg

回答

2

你應該鏈接libraryas一個庫,而不是目標代碼。

gcc -Ilibconfig controller.c -o Controller -Llibconfig -lconfig 

Linux和OS X使用完全不同的連接器,因此它們在接受的文件類型上可能會有不同的表現。

+0

同樣的問題,我已經嘗試了上述,建議在另一個SO問題上。 – user1479589

+0

我很懷疑。在命令行上列出文件並不意味着它是一個目標文件; gcc命令和鏈接器能夠識別不同類型的文件並適當地處理它們。 '-lconfig「只是」libconfig with any library suffix「的縮寫,而」-L「只是添加一個目錄來檢查庫文件。問題很可能是路徑問題(libconfig/libconfig.a不存在於Linux系統中的「。」中)或庫中的問題(未正確構建,未編入索引等)。 –

+0

它看起來像我需要再次生成庫,我在OSX上生成的.a文件在Linux上不起作用。這是否意味着,我需要整個libconfig源代碼在我的項目中,並且每次構建項目時都必須構建它?像做./configure,然後讓每一次? – user1479589