cmake中修改默认编译器的两个问题

在为交叉编译工程写cmake脚本时,可以在脚本里修改默认编译器的值。这种方法会碰到下面两个问题

1 CMAKE_CXX_COMPILER_VERSION的值仍然是默认编译器的版本

例如,下面是一个经过简化后的CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)

project(main C CXX)

include(CMakePrintHelpers)

cmake_print_variables(CMAKE_CXX_COMPILER)
cmake_print_variables(CMAKE_CXX_COMPILER_VERSION)

set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.8")

cmake_print_variables(CMAKE_CXX_COMPILER)
cmake_print_variables(CMAKE_CXX_COMPILER_VERSION)

set(CMAKE_VERBOSE_MAKEFILE ON)
add_executable(main main.cpp)

cmake+make的输出如下:

mdy@mdy-pc:~/TestCmake/build$ cmake ../
-- The C compiler identification is GNU 5.5.0
-- The CXX compiler identification is GNU 5.5.0
-- 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
-- Detecting C compile features
-- Detecting C compile features - 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
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- CMAKE_CXX_COMPILER="/usr/bin/c++"
-- CMAKE_CXX_COMPILER_VERSION="5.5.0"
-- CMAKE_CXX_COMPILER="/usr/bin/g++-4.8"
-- CMAKE_CXX_COMPILER_VERSION="5.5.0"
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mdy/TestCmake/build
mdy@mdy-pc:~/TestCmake/build$ make
/usr/bin/cmake -H/home/mdy/TestCmake -B/home/mdy/TestCmake/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/mdy/TestCmake/build/CMakeFiles /home/mdy/TestCmake/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/mdy/TestCmake/build'
make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend
make[2]: Entering directory '/home/mdy/TestCmake/build'
cd /home/mdy/TestCmake/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/mdy/TestCmake /home/mdy/TestCmake /home/mdy/TestCmake/build /home/mdy/TestCmake/build /home/mdy/TestCmake/build/CMakeFiles/main.dir/DependInfo.cmake --color=
Scanning dependencies of target main
make[2]: Leaving directory '/home/mdy/TestCmake/build'
make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build
make[2]: Entering directory '/home/mdy/TestCmake/build'
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
/usr/bin/g++-4.8     -o CMakeFiles/main.dir/main.cpp.o -c /home/mdy/TestCmake/main.cpp
[100%] Linking CXX executable main
/usr/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=1
/usr/bin/g++-4.8     CMakeFiles/main.dir/main.cpp.o  -o main 
make[2]: Leaving directory '/home/mdy/TestCmake/build'
[100%] Built target main
make[1]: Leaving directory '/home/mdy/TestCmake/build'
/usr/bin/cmake -E cmake_progress_start /home/mdy/TestCmake/build/CMakeFiles 0

可以看到,set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.8")命令之后,默认编译器已经由g++-5.5修改为了g++-4.8,且编译阶段确实也使用的是g++-4.8。但是此时CMAKE_CXX_COMPILER_VERSION的值仍然是5.5。

2 和add_subdirectory一块使用造成cmake死循环

例如,顶层CMakeLists.txt中的内容如下:

cmake_minimum_required(VERSION 3.10)

project(main C CXX)

set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.8")

add_subdirectory(sub)

子目录sub/CMakeLists.txt中只有一行:

project(sub C CXX)

cmake就会陷入死循环:

mdy@mdy-pc:~/TestCmake/build$ cmake ../
-- The C compiler identification is GNU 5.5.0
-- The CXX compiler identification is GNU 5.5.0
-- 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
-- Detecting C compile features
-- Detecting C compile features - 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
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_CXX_COMPILER= /usr/bin/c++

-- The C compiler identification is GNU 5.5.0
-- The CXX compiler identification is GNU 5.5.0
-- 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
-- Detecting C compile features
-- Detecting C compile features - 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
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_CXX_COMPILER= /usr/bin/c++

-- The C compiler identification is GNU 5.5.0
-- The CXX compiler identification is GNU 5.5.0
-- 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
…………

解决方法

问题1:

  • 在命令行里修改默认编译器的定义。例如:
cmake ../ -DCMAKE_CXX_COMPILER="/usr/bin/g++-4.8"
  • 使用CMAKE_TOOLCHAIN_FILE。例如:
cmake ../ -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake

问题2:

  • 在子目录的CMakeLists.txt里,不使用project(...)命令

但是有个更简单的方法,可以解决以上所有问题:
在第一个project命令前,修改默认编译器的定义。
例如:

cmake_minimum_required(VERSION 3.10)

set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.8")

project(main C CXX)

add_subdirectory(sub)

add_executable(main main.cpp)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容