【问题标题】:CMake CMAKE_AUTOMOC in cross compilation交叉编译中的 CMake CMAKE_AUTOMOC
【发布时间】: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


    【解决方案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 包包含在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})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 2017-05-08
      • 2015-08-04
      • 2021-05-03
      • 2016-01-15
      相关资源
      最近更新 更多