gpt4 book ai didi

c++ - 交叉编译中的 CMake CMAKE_AUTOMOC

转载 作者:太空狗 更新时间:2023-10-29 22:58:52 25 4
gpt4 key购买 nike

我有以下问题。我正在尝试使用 CMake 中构建的 native 机制进行交叉编译。我准备了以下 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 的 moc ARM 图像 rootfs。

我尝试重新找到 moc 可执行文件,就像这篇文章的第一个答案一样:How to include a certain Qt installation using CMake?但没有运气。

我也尝试设置 QT_MOC_EXECUTABLEHOST 到正确路径的变量rootfs 而不是 TARGET一个但也没有运气。我认为这个变量在 CMAKE_AUTOMOC 时没有被 CMake 使用。设置为 ON因为在强制更改此缓存变量后 cmake 仍然使用来自 TARGET 的 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")

我设置了AM_QT_MOC_EXECUTABLE更正主值 CMakeList.txt但仍然在使用错误路径从 TARGET 生成提到的文件之后根文件系统。

最佳答案

感谢这篇文章,我终于找到了解决方案: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})

关于c++ - 交叉编译中的 CMake CMAKE_AUTOMOC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39075040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com