使用cmake进行交叉编译,选取主机定义而非目的定义

bsxbgnwa  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(101)

我在linux下交叉编译cmake时遇到问题。
cmake生成了一个带有-isystem /usr...子句的makefile,而/usr是宿主系统,所以它选择了所有错误的定义。特别烦人的是,cmake知道它是错误的,因为编译命令会发出大量的错误/警告,比如...
aarch 64-Linux-C++语言:警告:交叉编译中使用了不安全的头文件/库路径:'-isystem "/usr/本地/包含'
现在,我不是cmake方面的Maven,但我知道我必须在工具链文件中指定一个查找路径,类似于...

set(CMAKE_SYSTEM_NAME Linux)
set(BR_PATH "/home/mike/work/v3")
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_CROSSCOMPILING 1)

# which compilers to use for C and C++

set(CMAKE_C_COMPILER ${BR_PATH}/output/host/bin/aarch64-buildroot-linux-gnu-gcc.br_real)
set(CMAKE_CXX_COMPILER ${BR_PATH}/output/host/bin/aarch64-linux-c++)

set(CMAKE_FIND_ROOT_PATH "${BR_PATH}/output/host/lib; ${BR_PATH}/output/host/aarch64-buildroot-linux-gnu/sysroot")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

现在,它很清楚地选择了这个工具链文件,因为它使用了正确的编译器。我不明白为什么它忽略了我的CMAKE_FIND_ROOT_PATH。
我尝试通过设置(CMAKE_IGNORE_PATH /usr)来强制它执行,但它仍然在生成的makefile中包含“-isystem /usr/include”。
我做错了什么?

hgncfbus

hgncfbus1#

您忘了在工具链文件中设置CMAKE_SYSROOT。这可能会起作用:

set(CMAKE_SYSROOT "${BR_PATH}/output/host/aarch64-buildroot-linux-gnu/sysroot")

请参见以下站点中有关交叉编译到Linux系统的文档:https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux

相关问题