2015-11-04 6 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 макроса передаются как в НКУ, и, естественно, не знаю, что такое Q_OBJECT и поэтому терпит неудачу. Возможно, старая сборка, QMake сгенерировала новые файлы заголовков и использовала их вместо оригинальных, или избегала этой проблемы каким-то другим способом.

Любые идеи, как решить эту проблему? Я смотрел он-лайн, но не нашел окончательного ответа, и я чувствую, что должно быть прямое решение. Надеюсь, мне не нужно изменять какой-либо исходный код, поскольку это всего лишь небольшая часть более крупного проекта.

ответ

1

Я нашел проблему, и это было довольно глупо, но я хочу объяснить это на случай, если кто-то сталкивается с подобной проблемой при конвертации из QMake.

Поскольку мой код скомпилирован просто отлично, используя QMake, я не заглянул в фактический исходный файл EnvisionWindow.h, о котором жаловался gcc, считая, что это должна быть проблема с сборкой. Когда я, наконец, посмотрел, я увидел, что этот файл содержит нет, поэтому компилятор не смог найти определение для Q_OBJECT.

Причина, по которой он работал с QMake, заключается в том, что эта сборка использует предварительно скомпилированный заголовок с флагом -include, используемым для каждого исходного файла, тем самым вводя все необходимые определения. Это поведение автоматически получается при использовании PRECOMPILED_HEADER = precompiled_header_name.h в файле QMake .pro. Я бы хотел, чтобы QMake этого не делал, поскольку все файлы в моем проекте должны явно включать предварительно скомпилированный заголовок.

В любом случае, решение было тривиальным: включите предварительно скомпилированный заголовок в EnvisionWindow.h, и теперь все компилируется.

Полученный урок: принять ошибку компилятора более буквально.

 Смежные вопросы

  • Нет связанных вопросов^_^