clang问题记:libc++和libstdc++
把代码拿到新买的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等。