【发布时间】:2016-12-28 17:45:12
【问题描述】:
我有以下问题。我正在尝试使用 CMake 中的本机机制构建进行交叉编译。我准备了以下 toolchain.cmake 文件:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_SYSROOT /tmp/filesystem)
set(tools /opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf)
set(CMAKE_C_COMPILER ${tools}-gcc)
set(CMAKE_CXX_COMPILER ${tools}-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
在目标CMakeList.txt 中使用:
set(CMAKE_AUTOMOC ON)
我希望当我使用 CMAKE_FIND_ROOT_PATH_MODE_PROGRAM 设置为 NEVER 时,根据文档,CMake 将使用来自 HOST 的 moc:
如果设置为 NEVER,则 CMAKE_FIND_ROOT_PATH 中的根将是 被忽略,只会使用主机系统根目录。
但它仍然尝试使用来自TARGET arm image rootfs 的 moc。
我尝试重新找到 moc 可执行文件,就像这篇文章的第一个答案:How to include a certain Qt installation using CMake? 但没有运气。
我还尝试将QT_MOC_EXECUTABLE 变量设置为从HOST rootfs 而不是TARGET 的正确路径,但也没有运气。我认为当CMAKE_AUTOMOC 设置为ON 时,CMake 不会使用此变量,因为在强制更改此缓存变量后,cmake 仍然使用来自TARGET rootfs 的 moc。
有什么办法可以解决这个问题吗?
# 编辑 1
我发现 automoc 在 build 文件夹中生成了这样的文件:
CMakeFiles/*target_name*_automoc.dir/AutogenInfo.cmake
在我的例子中,这样的变量被设置为错误的路径:
set(AM_QT_MOC_EXECUTABLE "/tmp/filesystem/usr/lib/arm-linux-gnueabihf/qt5/bin/moc")
应该是:
set(AM_QT_MOC_EXECUTABLE "/usr/bin/moc")
我在主CMakeList.txt 中将AM_QT_MOC_EXECUTABLE 设置为正确的值,但在生成提到的文件后仍然使用来自TARGET rootfs 的错误路径。
【问题讨论】:
标签: c++ qt cmake cross-compiling