近期需要使用cmake编译项目。而项目要求c++11支持。在服务器中,有多个gcc编译命令同时存在。问题就出在这里,cmake产生的makefile文件,执行make后,一直提示不支持c++11的语法。明显就是调用的g++命令版本不对。
仔细查看了下cmake时的输出结果,发现如下重要信息:
-- The C compiler identification is GNU 4.4.6
-- The CXX compiler identification is GNU 4.4.6
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
我们可以看到,这里面主要是编译器的路径检查。而这里,检查到的gcc命令的路径是
/usr/bin/c++
而这里的c++,其实是g++,不知道是系统改名的还是管理员手动改名的。查看了下它的版本: 4.4.6,果然是不支持c++11的版本。也就是说,如果我们不指定编译器,那么,cmake会使用系统原生的编译器。
现在,问题是找到了,那么如何解决呢?在cmake生成makefile文件时,指定编译器。How?
1.设置环境变量
exportCC=gcc-4.2 CXX=/usr/bin/g++-4.2
其中,CC是设置gcc编译器,而CXX是设置g++编译器。这个方法不适用于Xcode
2.使用 cmake -D
在命令行下,使用-D 设置CMAKE_FOO_COMPILER变量值为有效的编译器名称或者全路径。如
cmake -D CMAKE_C_COMPILER=gcc CMAKE_CXX_COMPILER=g++ /path/to/your/source
3.(避免)使用set()
使用set()在CMakeLists.txt 文件中设置CMAKE_FOO_COMPILER变量值为有效的编译器名称或者全路径。必须在任何语言之前调用set(比如projuect()或enable_language())。
例如:
SET(CMAKE_C_COMPILER /usr/bin/gcc)
SET(CMAKE_CXX_COMPILER /usr/bin/g++)
这个方法,在我的服务器中,无效。不知道是因为我的服务器问题,还是cmake开始不支持这个方法了。正如FAQ中所言,我们还是避免使用吧。