在为交叉编译工程写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)