交叉编译中的 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})
我有以下问题。我正在尝试使用 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.
有解决此问题的想法吗?
# 编辑 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})