首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测到我正在CMakeLists.txt中交叉编译?

如何检测到我正在CMakeLists.txt中交叉编译?
EN

Stack Overflow用户
提问于 2016-11-10 12:59:07
回答 3查看 7.7K关注 0票数 7

CMake文档表明交叉编译时设置了CMAKE_CROSSCOMPILING。在我的CMakeLists.txt中,我有这样的台词:

代码语言:javascript
复制
IF(CMAKE_CROSSCOMPILING)
    message(STATUS "Cross-compiling so skipping unit tests.")
    option(GAME_PORTAL_UNIT_TEST "Enable unit testing of Game Portal code" OFF)
ELSE()
    message(STATUS "Enabling unit testing of Game Portal code")
    option(GAME_PORTAL_UNIT_TEST "Enable unit testing of Game Portal code" ON)
ENDIF()

运行的输出:

代码语言:javascript
复制
cmake -DCMAKE_TOOLCHAIN_FILE=../crosscompile/raspberry_pi/CMakeCross.txt .

包括文本“启用游戏门户代码的单元测试”,因此很明显这个变量没有被设置,或者它的计算结果无论如何都是真的。

我尝试修改CMakeCross.txt以包括:

代码语言:javascript
复制
set(CMAKE_CROSSCOMPILING ON CACHE BOOL "Cross-compiling" FORCE)

在清除旧的CMakeCache.txt并重新运行cmake命令之后,我可以看到新的CMakeCache.txt现在包含了这个变量,但是对于启用的单元测试,我仍然得到了相同的结果。

如何可靠地检测到我正在交叉编译,以便正确禁用单元测试?

根据请求,完整的交叉编译文件是:

代码语言:javascript
复制
# Set minimum cmake version required for cross-compiling to work.
cmake_minimum_required(VERSION 2.6)
# Build with rm CMakeCache.txt; cmake -DCMAKE_TOOLCHAIN_FILE=/home/crosscompile/dev/raspberry_pi/CMakeCross.txt .. 

# Set target system name.
SET (CMAKE_SYSTEM_NAME Linux)

# Set compiler name.
SET (CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
SET (CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)

# Set path(s) to search for libraries/binaries/headers.
SET (CMAKE_FIND_ROOT_PATH /home/crosscompile/dev/raspberry_pi/rootfs/)

# Ensure only cross-compiler directories are searched.
SET (ONLY_CMAKE_FIND_ROOT_PATH TRUE)

# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# Set output/install directory to safe place.
SET (CMAKE_INSTALL_PREFIX /home/crosscompile/dev/raspberry_pi/install/)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rpath-link=/lib/arm-linux-gnueabihf")
set(THREADS_PTHREAD_ARG 0)
set(CMAKE_CROSSCOMPILING ON CACHE BOOL "Cross-compiling" FORCE)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-10 14:09:02

CMAKE_CROSSCOMPILING的测试必须在CMakeLists.txt中的“项目”指令之后进行。

票数 7
EN

Stack Overflow用户

发布于 2016-11-10 13:25:04

使用在源代码中构建时,当大量更改配置参数时,需要手动清除构建文件。

例如,如果您以前做过本机构建,然后决定交叉编译,则需要执行手动清理: CMake不能自动调整生成目录从一种构建类型到另一种构建类型。

这是不推荐源代码构建的原因之一,应该用源代码外构建来替换。

票数 1
EN

Stack Overflow用户

发布于 2022-02-23 12:32:23

这个cmake -DCMAKE_TOOLCHAIN_FILE=..命令将设置CMAKE_TOOLCHAIN_FILE

检查交叉编译如下:

代码语言:javascript
复制
if (CMAKE_TOOLCHAIN_FILE)
    # This is in cross compiling condition.
    set(PROJECT_OUT_NAME ${PROJECT_NAME}.elf)
else ()
    set(PROJECT_OUT_NAME ${PROJECT_NAME})
endif()
add_executable(${PROJECT_OUT_NAME} "main.cpp")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40528254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档