我关注的问题。我想在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的错误路径生成的。
答案 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