Я пытаюсь перейти к общей библиотеке, которая использует 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 сгенерировала новые файлы заголовков и использовала их вместо оригинальных, или избегала этой проблемы каким-то другим способом.
Любые идеи, как решить эту проблему? Я смотрел он-лайн, но не нашел окончательного ответа, и я чувствую, что должно быть прямое решение. Надеюсь, мне не нужно изменять какой-либо исходный код, поскольку это всего лишь небольшая часть более крупного проекта.