2015-11-04 99 views
0

我正在嘗試將使用Qt 5和Q_OBJECT的共享庫從QMake過渡到CMake 3.2。這是當前CMakeLists.txt文件:Q_OBJECT在將qmake項目轉換爲cmake時未指定類型

cmake_minimum_required(VERSION 3.2.2) 

project(core) 

# Find includes in corresponding build directories 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
# Instruct CMake to run moc automatically when needed. 
set(CMAKE_AUTOMOC ON) 

find_package(Qt5Core REQUIRED) 
find_package(Qt5Gui REQUIRED) 
find_package(Qt5Widgets REQUIRED) 
find_package(Qt5Xml REQUIRED) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y -pedantic-errors -Werror -Wextra -O2 -g -fno-omit-frame-pointer -Woverloaded-virtual") 

add_definitions(-DCORE_LIBRARY) 
add_definitions(-DQT_PLUGIN) 
add_definitions(-DQT_NO_DEBUG) 
add_definitions(-DQT_SHARED) 

add_library(core SHARED 
    src/reflect/TypeRegistry.h 
    src/Profiler.h 
    src/reflect/typeIdMacros.h 
    src/reflect/Reflect.h 
    src/AdapterManager.h 
    src/core_api.h 
    src/core.h 
    src/EnvisionApplication.h 
    src/EnvisionException.h 
    src/EnvisionManager.h 
    src/EnvisionPlugin.h 
    src/PluginInfo.h 
    src/global.h 
    src/precompiled.h 
    src/TestEvent.h 
    src/TestRunner.h 
    src/PluginManager.h 
    src/EnvisionWindow.h 
    src/reflect/TypeRegistry.cpp 
    src/Profiler.cpp 
    src/AdapterManager.cpp 
    src/EnvisionException.cpp 
    src/EnvisionManager.cpp 
    src/core.cpp 
    src/EnvisionApplication.cpp 
    src/TestEvent.cpp 
    src/TestRunner.cpp 
    src/PluginManager.cpp 
    src/EnvisionWindow.cpp 
    src/global.cpp) 

target_link_libraries(core Qt5::Core Qt5::Widgets Qt5::Xml Qt5::Gui) 

有了這個CMakeLists.txt文件,我可以運行cmake,它運行沒有任何錯誤或警告。然而,當我運行make我得到一個錯誤:

$ make 
[ 7%] Automatic moc for target core 
Generating moc_EnvisionApplication.cpp 
Generating moc_EnvisionWindow.cpp 
Generating moc_TestRunner.cpp 
[ 7%] Built target core_automoc 
Scanning dependencies of target core 
[ 14%] Building CXX object CMakeFiles/core.dir/src/reflect/TypeRegistry.cpp.o 
[ 21%] Building CXX object CMakeFiles/core.dir/src/Profiler.cpp.o 
[ 28%] Building CXX object CMakeFiles/core.dir/src/AdapterManager.cpp.o 
[ 35%] Building CXX object CMakeFiles/core.dir/src/EnvisionException.cpp.o 
[ 42%] Building CXX object CMakeFiles/core.dir/src/EnvisionManager.cpp.o 
[ 50%] Building CXX object CMakeFiles/core.dir/src/core.cpp.o 
In file included from /store/envision/envision/Core/src/core.cpp:27:0: 
/store/envision/envision/Core/src/EnvisionWindow.h:30:1: error: expected class-name before ‘{’ token 
{ 
^ 
/store/envision/envision/Core/src/EnvisionWindow.h:31:2: error: ‘Q_OBJECT’ does not name a type 
    Q_OBJECT 
^
    ... 

正如你所看到的,MOC運行,但似乎與Q_OBJECT宏原頭文件傳遞的是gcc和它自然有不知道Q_OBJECT是什麼,因此失敗。也許舊版本,QMake生成新的頭文件並使用它們而不是原始文件,或者以其他方式避免這個問題。

任何想法如何解決這個問題?我在網上查找,但沒有找到明確的答案,我覺得應該有一個直接的解決方案。希望我不必修改任何源代碼,因爲這只是較大項目的一小部分。

回答

1

我發現了這個問題,它很愚蠢,但我想解釋一下,以防其他人在從QMake轉換時遇到類似問題。

由於我的代碼編譯使用QMake很好,我沒有看到gcc抱怨的實際源文件EnvisionWindow.h,認爲它必須是構建問題。當我終於看到了,我看到這個文件包含沒有包括,這就是爲什麼編譯器找不到Q_OBJECT的定義。

它與QMake一起使用的原因是因爲該版本使用一個預編譯頭文件,每個源文件使用-include標誌,因此注入了所有必要的定義。這是在QMake .pro文件中使用PRECOMPILED_HEADER = precompiled_header_name.h時會自動獲得的行爲。我希望QMake沒有這樣做,因爲我的項目中的所有文件都應該明確包含預編譯頭文件。

無論如何,解決方案是微不足道的:在EnvisionWindow.h包括預編譯頭文件,現在一切正常。

獲得的經驗教訓:從字面上理解編譯器錯誤。

相關問題