【发布时间】:2020-07-08 13:28:24
【问题描述】:
我正在编写用于交叉编译的 CMake 工具链文件。
我有几个工具链,它们的差别非常小。我想为 cmake 创建一个描述所有工具链的文件,并让用户从命令行指定它们:cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake -DTOOLCHAIN_NAME=<name>
不过,TOOLCHAIN_NAME 似乎有时会变成一个空字符串。
这里是工具链文件的例子:
set(tools /opt/toolchains/Custom/toolchains/toolchain)
set(sdk /opt/toolchains/Custom/platforms/)
message(STATUS "toolchain_name ${TOOLCHAIN_NAME}")
if(NOT TOOLCHAIN_NAME)
message(SEND_ERROR "Please specify toolchain name in -DTOOLCHAIN_NAME parameter")
endif()
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)
# further processing
然后我调用 CMake:
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain.cmake -DTOOLCHAIN_NAME=proc-os-gnueabi-gcc_6_3
并得到以下错误输出:
-- toolchain name proc-os-gnueabi-gcc_6_3
-- toolchain name proc-os-gnueabi-gcc_6_3
-- The C compiler identification is GNU 6.3.1
-- The CXX compiler identification is GNU 6.3.1
-- Check for working C compiler: /opt/toolchains/.../bin/arm-os-gnueabi-gcc
CMake Error at /home/user/project/cmake/toolchain.cmake:59 (message):
Please specify toolchain name in -DTOOLCHAIN_NAME parameter
Call Stack (most recent call first):
/home/user/project/build/CMakeFiles/3.15.4/CMakeSystem.cmake:6 (include)
/home/user/project/build/CMakeFiles/CMakeTmp/CMakeLists.txt:2 (project)
CMake Error at /usr/local/share/cmake-3.15/Modules/CMakeTestCCompiler.cmake:44 (try_compile):
Failed to configure test project build system.
Call Stack (most recent call first):
CMakeLists.txt:15 (project)
-- Configuring incomplete, errors occurred!
See also "/home/user/project/build/CMakeFiles/CMakeOutput.log".
See also "/home/user/project/build/CMakeFiles/CMakeError.log".
CMakeOutput.log 和 CMakeError.log 包含消息,表示编译器没有找到某些库。
如果我打开生成的文件/home/user/project/build/CMakeFiles/3.15.4/CMakeSystem.cmake 我可以看到以下内容
set(CMAKE_HOST_SYSTEM "Linux-4.2.0-27-generic")
set(CMAKE_HOST_SYSTEM_NAME "Linux")
set(CMAKE_HOST_SYSTEM_VERSION "4.2.0-27-generic")
set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64")
include("/home/user/project/cmake/toolchain.cmake")
set(CMAKE_SYSTEM "Generic")
set(CMAKE_SYSTEM_NAME "Generic")
set(CMAKE_SYSTEM_VERSION "")
set(CMAKE_SYSTEM_PROCESSOR "ARM")
set(CMAKE_CROSSCOMPILING "TRUE")
set(CMAKE_SYSTEM_LOADED 1)
根据 CMake 手册,其-D 参数用于指定缓存条目。
我从上面的输出中得出结论,提供的工具链文件由 CMake 处理至少 3 次。在前两次有适当的缓存条目,在第三次运行时它们不存在。
那么,如何避免工具链文件的代码重复?
UPD。在阅读this question 之后,我尝试了CMake 命令行参数的几种排列:在工具链之后但在选项之前指定源路径,在选项之后指定它,使用-S 和-B 选项显式指定源路径和构建路径。没有任何帮助。
【问题讨论】:
-
也许您遇到了回复here中描述的问题。
-
感谢您的指出。我已经尝试过并且失败了。问题已更新。
标签: c++ cmake cross-compiling