把代碼拿到新買的macbook上編譯時,出現莫名其妙的鏈接錯誤:
Undefined symbols for architecture x86_64:
"CppUnit::SourceLine::SourceLine(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
test_codec::test() in test_codec.o
相信也會有不少朋友碰到這問題,下面我備忘一下查錯的過程。
這分代碼之前的版本曾經是在mac構建成功的,但記得當時用的是gcc而非xcode默認的clang,也許差別就在其中,因此首先嘗試編一份clang的cppunit,即 export CXX=clang; make clean && ./configure && make -j4。發現其自帶的測試程序simple就鏈不過了。聯想到gcc和g++的關系,發現果然有個clang++程序,試下把CXX改成clang++再build,通過了,但是把庫拿到我的工程里用仍然報引用未定義符號的錯誤並且還是這些std類。這時想到用ldd檢查下其自帶的simple程序是通過鏈接哪些庫來解決引用的,在mac下ldd被換成了otool -L,檢查simple依賴的結果發現包含libstdc++.so,而在xcode的編譯選項中有一個c++ standard library的項,其默認值是libc++,經搜索得知這是一個蘋果新寫的c++標准庫,用來支持最新的c++11標准。於是知道這是兩端庫不統一的問題,加上export CXXFLAGS=-stdlib=libc++后再執行build,將生成的lib重新拿去使用,構建成功!因此,以前編的依賴庫里凡是用到c++的都得重新編譯了,如cppunit、freeimage等。