我想鏈接編譯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路徑應該被修改。
如果有人可以給我提示如何解決這個問題,我將非常感謝!
除了用'stdC++'手動鏈接,爲什麼不簡單地用'g ++'來構建你的C++代碼,它會自動處理它呢? –
我沒有很好的答案,因爲我不熟悉C/C++構建工具的複雜性,我現在會嘗試做到這一點,看看是否有任何改變。 –
我用G ++替換了GCC並刪除了lstdC++標誌。至少在鏈接步驟中,沒有任何變化,錯誤持續不幸:/ –