Ошибка компоновщика после перехода от QMake к CMakeC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ошибка компоновщика после перехода от QMake к CMake

Сообщение Anonymous »

Я пытаюсь перейти с qmake на CMake. При этом у меня не так много опыта написания файлов CMakeLists, и я использовал Python-скрипт qmake2cmake для создания исходного файла CMakeLists.txt.
Кажется, что код компилируется нормально, однако на этапе компоновки Я получаю неопределенную ссылку:

Код: Выделить всё

/usr/bin/ld: CMakeFiles/GerberStencilGenerator.dir/GerberStencilGenerator_autogen/mocs_compilation.cpp.o: in function `GerberStencilGenerator::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)':
mocs_compilation.cpp:(.text+0xc375): undefined reference to `GerberStencilGenerator::afterWindowIsShown()'

Код: Выделить всё

afterWindowIsShown
является частным слотом основного класса и существует, и при использовании qmake код прекрасно компилируется и связывается.
Я предполагаю, что есть некоторая проблема с moc-компиляцией но это все. Я здесь совершенно потерялся.
Это мой CMakeLists.txt:

Код: Выделить всё

cmake_minimum_required(VERSION 3.16)
project(GerberStencilGenerator VERSION 1.0 LANGUAGES C CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
add_definitions(-DQT_NO_KEYWORDS)
list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS "ui" "src")

find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui Xml)
find_package(Qt${QT_VERSION_MAJOR} OPTIONAL_COMPONENTS Widgets)

find_package(PkgConfig REQUIRED)

qt_standard_project_setup()
qt_add_executable(GerberStencilGenerator WIN32 MACOSX_BUNDLE
src/apertureeditview.cpp src/apertureeditview.h

... all the other source files ...

ui/settingsdialog.ui
)
target_include_directories(GerberStencilGenerator PRIVATE
src
ui
)

target_compile_definitions(GerberStencilGenerator PRIVATE
QT_DEPRECATED_WARNINGS
QT_NO_KEYWORDS
)
target_link_libraries(GerberStencilGenerator PRIVATE
Qt::Core
Qt::Gui
Qt::Xml
)

pkg_check_modules(GTK2 REQUIRED gtk+-2.0)
pkg_check_modules(LIBGERBV REQUIRED libgerbv)
pkg_check_modules(CAIRO REQUIRED cairo)
pkg_check_modules(PIXMAN REQUIRED pixman-1)
target_include_directories(GerberStencilGenerator PUBLIC
${GTK2_INCLUDE_DIRS}
${LIBGERBV_INCLUDE_DIRS}
${CAIRO_INCLUDE_DIRS}
${PIXMAN_INCLUDE_DIRS}
)
target_link_libraries(GerberStencilGenerator PUBLIC
${GTK2_LIBRARIES}
${LIBGERBV_LIBRARIES}
${CAIRO_LIBRARIES}
${PIXMAN_LIBRARIES}
)
target_compile_options(GerberStencilGenerator PUBLIC
${GTK2_CFLAGS_OTHER}
${LIBGERBV_CFLAGS_OTHER}
${CAIRO_CFLAGS_OTHER}
${PIXMAN_CFLAGS_OTHER}
)

# Resources:
set_source_files_properties("resources/apertures/circle.svg"
PROPERTIES QT_RESOURCE_ALIAS "circle"
)

... all the other resources ...

)

if((QT_VERSION_MAJOR GREATER 4))
target_link_libraries(GerberStencilGenerator PRIVATE
Qt::Widgets
)
endif()
install(TARGETS GerberStencilGenerator
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

qt_generate_deploy_app_script(
TARGET GerberStencilGenerator
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})
и соответствующий слот в файле заголовка определяется с использованием соответствующего макроса No-Keyword-Macro следующим образом:

Код: Выделить всё

private Q_SLOTS:
void afterWindowIsShown( void );
и, как я уже говорил, при использовании qmake этот код работает отлично.
Любая помощь будет принята с благодарностью!

Подробнее здесь: https://stackoverflow.com/questions/793 ... e-to-cmake
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»