在交叉编译中CMake CMAKE_AUTOMOC

时间:2016-08-22 08:50:52

标签: c++ qt cmake cross-compiling

我关注的问题。我想在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。

有任何想法如何解决此问题?

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

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

1 个答案:

答案 0 :(得分:1)

由于这篇文章我终于找到了解决方案:How can I use CMake's AUTOMOC feature with a custom Qt package?。我假设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包被包含在{{{ 1}}文件。

同样的问题与其他qt工具一样,因此更通用的选项将是:

CMakeList.txt