交叉编译中的 CMake CMAKE_AUTOMOC

CMake CMAKE_AUTOMOC in cross compilation

我有以下问题。我正在尝试使用 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:

If set to NEVER, then the roots in CMAKE_FIND_ROOT_PATH will be ignored and only the host system root will be used.

但是它仍然尝试使用来自 TARGET arm image rootfs 的 moc。

我尝试重新找到 moc 可执行文件,就像这个 post 的第一个答案一样: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 在构建文件夹中生成这样的文件:

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")

我将 AM_QT_MOC_EXECUTABLE 设置为更正主 CMakeList.txt 中的值,但在生成提到的文件后仍然使用来自 TARGET rootfs 的错误路径。

多亏了这个post我终于找到了解决方案:。因为我假设 QT_MOC_EXECUTABLE 没有被 AUTOMOC.

直接使用

在第一个 qt find_package 之前必须添加以下行:

set(QT_MOC_EXECUTABLE /usr/bin/moc)
add_executable(Qt5::moc IMPORTED)
set_property(TARGET Qt5::moc PROPERTY IMPORTED_LOCATION ${QT_MOC_EXECUTABLE})

这里的问题是,不仅变量 QT_MOC_EXECUTABLE 必须设置为正确的值,而且最终 automoc 仅使用 Qt5:moc 目标,该目标必须在任何 qt 包被包含在之前声明CMakeList.txt 文件。

其他 qt 工具也存在同样的问题,因此更通用的选项是:

file(GLOB Qt_bin /usr/bin)
find_program(QT_MOC_EXECUTABLE qt_moc moc PATHS ${Qt_bin})
add_executable(Qt5::moc IMPORTED)
set_property(TARGET Qt5::moc PROPERTY IMPORTED_LOCATION ${QT_MOC_EXECUTABLE})