在為交叉編譯工程寫cmake腳本時(shí),可以在腳本里修改默認(rèn)編譯器的值。這種方法會(huì)碰到下面兩個(gè)問題
1 CMAKE_CXX_COMPILER_VERSION的值仍然是默認(rèn)編譯器的版本
例如级野,下面是一個(gè)經(jīng)過簡化后的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")命令之后,默認(rèn)編譯器已經(jīng)由g++-5.5修改為了g++-4.8烁巫,且編譯階段確實(shí)也使用的是g++-4.8。但是此時(shí)CMAKE_CXX_COMPILER_VERSION的值仍然是5.5宠能。
2 和add_subdirectory一塊使用造成cmake死循環(huán)
例如亚隙,頂層CMakeLists.txt中的內(nèi)容如下:
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就會(huì)陷入死循環(huán):
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:
- 在命令行里修改默認(rèn)編譯器的定義。例如:
cmake ../ -DCMAKE_CXX_COMPILER="/usr/bin/g++-4.8"
- 使用CMAKE_TOOLCHAIN_FILE违崇。例如:
cmake ../ -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
問題2:
- 在子目錄的CMakeLists.txt里阿弃,不使用project(...)命令
但是有個(gè)更簡單的方法,可以解決以上所有問題:
在第一個(gè)project命令前羞延,修改默認(rèn)編譯器的定義渣淳。
例如:
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)