不确定我在这里遇到什么问题。
CMAKE_CXX_FLAGS = -Wall -std=c++0x -stdlib=libc++ -v
使用输出构建良好...
[100%] Building CXX object CMakeFiles/soupbintcptest.dir/soupmessages_tests.cpp.o
clang version 3.1 (tags/RELEASE_31/final)
Target: x86_64-apple-darwin11.3.0
Thread model: posix
链接转储了一系列错误。 ABI错误?我知道这个C ++ 11名称空间错误发生了。
Undefined symbols for architecture x86_64:
它们是std::
命名空间中不会链接的所有内容:
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::_Setprecision)", referenced from:
testing::AssertionResult testing::internal::FloatingPointLE<float>(char const*, char const*, float, float) in libgtest.a(gtest-all.cc.o)
testing::AssertionResult testing::internal::FloatingPointLE<double>(char const*, char const*, double, double) in libgtest.a(gtest-all.cc.o)
testing::Message::Message() in libgtest.a(gtest-all.cc.o)
或
"std::cerr", referenced from:
testing::internal::GTestLog::GetStream() in libgtest.a(gtest-all.cc.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
testing::UnitTest::AddTestPartResult(testing::TestPartResult::Type, char const*, int, testing::internal::String const&, testing::internal::String const&) in libgtest.a(gtest-all.cc.o)
testing::internal::SingleFailureChecker::~SingleFailureChecker() in libgtest.a(gtest-all.cc.o)
testing::internal::StringStreamToString(std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >*) in libgtest.a(gtest-all.cc.o)
testing::TestInfo::TestInfo(char const*, char const*, char const*, char const*, void const*, testing::internal::TestFactoryBase*) in libgtest.a(gtest-all.cc.o)
testing::TestInfo::~TestInfo() in libgtest.a(gtest-all.cc.o)
testing::internal::ReportInvalidTestCaseType(char const*, char const*, int) in libgtest.a(gtest-all.cc.o)
testing::internal::XmlUnitTestResultPrinter::PrintXmlUnitTest(__sFILE*, testing::UnitTest const&) in libgtest.a(gtest-all.cc.o)
...
我相信我用相同的clang ++版本构建了gtest。不知道还有什么可以解决这些问题。
答案 0 :(得分:1)
当链接器将不同的c ++库提供给与编译器正在构建的库相匹配的库时,我发现了类似的错误。在您的情况下,您只是修改编译器标志,但链接器不知道您的选择,并且可能链接到错误的C ++库。
如果你能够使用CMake 3.2或更高版本,那么我建议你不要直接修改C ++编译器标志,而是告诉CMake你想要使用C ++ 11然后让它运行适当的您的编译器和链接器标志。这可以通过在<{em> project()
电话之前添加以下来完成:
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
这个及相关的CMake功能在this article中详细讨论。
答案 1 :(得分:0)
关于名称修改没有C ++ 11,它从最初的C ++实现开始就一直在进行。但是,不要忘记你必须为同一个stdlib开关构建gtest,因为它找不到标准库。