2015-01-12 79 views
2

我想鏈接編譯research experiment project,內置C/C++。 該項目依賴於HyperNEAT和機器人仿真軟件WeBots。 我已成功克隆並構建HyperNEAT項目(在該項目中還有其他依賴項,如Boost,TinyXML,JGTL(自定義庫)和其他不相關的子項目)。C++使鏈接步驟:體系結構x86_64的未定義符號

我已經包括所有neccesary標題搜索路徑和庫路徑生成文件,並編譯兩個主要的.cpp文件:

/ModHyperNEAT/mod_ctrler7.cpp 
/ModSupervisor/mod_supervisor.cpp 

的作品,給我2個.o文件。

然而,在製作鏈接一步,當我要創建兩個文件(獨立)的可執行文件,我得到了「未定義的符號體系結構x86_64的」錯誤(見這裏引擎收錄:http://pastebin.com/kiwwCcUf)。看來不能找到C++標準數據類型和函數,如 std::string::end() const

我已經用Google搜索了這個答案,似乎任何庫都丟失或者二進制不兼容,如果我理解正確的話,但是這些庫在那裏,並且兩個項目都已經編譯了-lstdc++標誌。

這是化妝鏈接步驟(以及所使用的宏的Makefile中):

CC = gcc 
CFLAGS = -v -g -lstdc++ -Wall -Wno-error -ferror-limit=100 -fmessage-length=0 
DEFINES = -DHCUBE_NOGUI -DTIXML_USE_STL 
FLAGS = $(CFLAGS) $(DEFINES) 

LIB_TINYXML = -L/Users/michahell/Documents/projects_c++/HyperNEAT/tinyxmldll/out 
LIB_HYPERNEAT = -L/Users/michahell/Documents/projects_c++/HyperNEAT/NE/HyperNEAT/out 
LIB_BOOST = -L/usr/local/Cellar/boost/1.57.0/lib 
LIB_WEBOTS = -I/Applications/Webots/lib 

LIBS = $(LIB_TINYXML) $(LIB_HYPERNEAT) $(LIB_BOOST) $(LIB_WEBOTS) 
LIBFLAGS = -ltinyxmlpluslib -lboost_filesystem-mt -lboost_random-mt -lboost_system-mt -lNEATLib_d -lHypercube_NEAT_Base_d 
WEBOTS_DYLIB = -dylib_file /Applications/Webots/lib/libController.dylib:/Applications/Webots/lib/libController.dylib 

$(CC) $(FLAGS) $(LIBS) ./mod_ctrler7.o $(WEBOTS_DYLIB) $(LIBFLAGS) 

我發現鏈接到名爲.dylib的我不得不使用一個特定的標誌,並指定完整路徑,因此$(WEBOTS_DYLIB)宏。 我正在使用-lstdc++標誌,因爲在HyperNEAT項目中該標誌也用於構建該庫。如果我排除這個標誌,我會在編譯過程中遇到很多錯誤(libC++和libstdC++不兼容,因爲我現在明白了)。所有庫路徑檢出,並且.a和/或.dylib文件存在。

我對C/C++和GCC工具的瞭解非常有限,因爲我從來沒有使用過它。 我認爲這可能與HyperNEAT項目包含一個用於其構建的Boost 1.57.0發行版以及我的系統上安裝了單獨的(使用自制軟件)Boost版本這一事實相同版本:

$ brew info boost 
boost: stable 1.57.0 (bottled), HEAD 
http://www.boost.org 
/usr/local/Cellar/boost/1.57.0 (10572 files, 439M) * 

什麼可能導致此錯誤失敗我的鏈接步驟?任何人都應該能夠重現我的鏈接器錯誤,如果HyperNEAT我的項目克隆並將其根目錄放在同一位置。 WeBots應該被下載,但只能用於頭文件和庫。當然,我的makefile路徑應該被修改。

如果有人可以給我提示如何解決這個問題,我將非常感謝!

+0

除了用'stdC++'手動鏈接,爲什麼不簡單地用'g ++'來構建你的C++代碼,它會自動處理它呢? –

+0

我沒有很好的答案,因爲我不熟悉C/C++構建工具的複雜性,我現在會嘗試做到這一點,看看是否有任何改變。 –

+0

我用G ++替換了GCC並刪除了lstdC++標誌。至少在鏈接步驟中,沒有任何變化,錯誤持續不幸:/ –

回答

0

事實證明,出於某種原因,我必須將lstdc++標誌包含在庫鏈接標誌中,而不是作爲編譯器標誌,並且將stdlib=libstdc++作爲編譯器標誌。

相關問題