2016-08-22 123 views
3

我遇到以下问题。我正在使用CMake中的本地机制构建交叉编译。我准备以下toolchain.cmake文件:CMake CMAKE_AUTOMOC交叉编译

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的,根据文件,将使用从MOC HOST

如果设置为NEVER,然后在CMAKE_FIND_ROOT_PATH根将被 忽略,只有主机系统根将被使用。

但是它仍然尝试使用TARGET arm镜像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生成生成文件夹这样的文件:

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根文件生成后述文件。

回答

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})