2016-08-22 124 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})