gio*_*adi 10 c++ macos cmake c++11
我刚刚升级到Mountain Lion,所以我可以在xcode附带的新版Clang上使用一些C++ 11特性.我正在使用Homebrew的cmake 2.8.9.
我做了一个非常简单的CMake项目,它为C++ 11添加了编译器标志:
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_executable(test test.cxx)
add_definitions(-std=c++0x -stdlib=libc++)
Run Code Online (Sandbox Code Playgroud)
test.cxx中的C++代码如下:
#include <iostream>
int main()
{
std::cout << "Howdy" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行cmake和make时,文件编译得很好,但链接器输出以下错误:
Linking CXX executable test
Undefined symbols for architecture x86_64:
"std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::ios_base::getloc() const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char)", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
"std::__1::cout", referenced from:
_main in test.cxx.o
"std::__1::ctype<char>::id", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::locale::~locale()", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
"std::__1::ios_base::clear(unsigned int)", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [test] Error 1
make[1]: *** [CMakeFiles/test.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
如果我在CMakeLists.txt文件中注释掉add_definitions行,我没有错误,如果我删除test.cxx中的std :: cout行,我也可以避免错误.也许最奇怪的部分是,如果我只是跑
clang++ -std=c++0x -stdlib=libc++ test.cxx
Run Code Online (Sandbox Code Playgroud)
它编译得很好!因此,根据评论员的建议,我检查了cmake正在运行的实际命令以进行编译和链接.
编译:
/usr/bin/c++ -std=c++0x -stdlib=libc++ -o CMakeFiles/test.dir/test.cxx.o -c /Users/luis/test.cxx
Run Code Online (Sandbox Code Playgroud)
链接:
/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/test.dir/test.cxx.o -o test
Run Code Online (Sandbox Code Playgroud)
现在的主要问题似乎是链接器没有提供正确的C++ 11标志.是否有更好的方法来提供这些标志,以便编译器和链接器都使用它们?
sim*_*ont 12
我不确定这ADD_DEFINITIONS是否适合这项特殊工作.
也许更好的选择是CMAKE_CXX_FLAGS直接设置值:
cmake_minimum_required(VERSION 2.8)
set (CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++ -g3 -Wall -O0")
add_executable(test test.cxx)
Run Code Online (Sandbox Code Playgroud)
转到您的项目目标 - > Apple LLVM编译器4.1 - 语言 - >选择c ++库到
libc__(LLVM C++ stadard library with c++ 11 support);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10585 次 |
| 最近记录: |