首页 > 解决方案 > CMake 不生成 Qt moc 规则

问题描述

这是一个调试问题。我正在尝试使用AUTOMOC功能将 Qt moc'ing 集成到 CMake 托管项目中。尽管我相信我遵循了指导方针,但我还没有设法生成包含 moc 规则的项目。

我已经使用以下命令检查了是否确实列出了预期的文件:

get_target_property(MY_PROJECT_SOURCES CMAKETEST SOURCES)
message("${MY_PROJECT_SOURCES}")

我确实注意到它${AUTOMOC_MACRO_NAMES}最初是空的并且没有CMAKE_AUTOMOC_MACRO_NAME像文档声称的那样初始化,这可能暗示了问题的原因。我试图添加一个明确set(AUTOMOC_MACRO_NAMES "${CMAKE_AUTOMOC_MACRO_NAMES}")的尝试解决这个问题。

我写了一个 MCVE,它在我的系统上重现了这个问题。这是 CMakeList 文件:

# CMake version expected
cmake_minimum_required(VERSION 3.18)

# Project title
project(CMAKETEST)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# specify source files
set(DIR_SRC "${CMAKETEST_SOURCE_DIR}/src")
file(GLOB_RECURSE SRC_LIST ${DIR_SRC}/*.cpp ${DIR_SRC}/*.h ${DIR_SRC}/*.hpp)

add_executable(CMAKETEST ${SRC_LIST})


# include Qt

# enable Qt support
set_target_properties(CMAKETEST PROPERTIES AUTOMOC TRUE)
set_target_properties(CMAKETEST PROPERTIES AUTOUIC TRUE)
set_target_properties(CMAKETEST PROPERTIES AUTORCC TRUE)

# Find Qt libs
set(QT_DIR $ENV{QT_HOME_DIR})
set(CMAKE_PREFIX_PATH "${QT_DIR}")
find_package(Qt5 COMPONENTS Core REQUIRED)
target_link_libraries(CMAKETEST Qt5::Core)
set(AUTOMOC_MACRO_NAMES "${CMAKE_AUTOMOC_MACRO_NAMES}")

项目文件树如下所示:

project_root
│   CMakeLists.txt
│
├───build
└───src
        main.cpp
        my_qt_obj.cpp
        my_qt_obj.h

my_qt_obj.h

#pragma once
#include <QObject>

class my_qt_obj : public QObject
{
    Q_OBJECT
public slots:
    void my_slot();
signals:
    void my_sig();
};

my_qt_obj.cpp

#include "my_qt_obj.h"
void my_qt_obj::my_slot() {}

main.cpp

#include "my_qt_obj.h"
int main() {
    my_qt_obj foo;
    QObject::connect(&foo, &my_qt_obj::my_sig, &foo, &my_qt_obj::my_slot);
}

可以预见的是,由于没有生成 moc 规则,因此由于未解析的外部符号而导致链接错误。但是 CMake 没有报告错误。

我用来构建的命令是:cmake -S . -B build -A x64来自项目根目录。我正在使用 CMake 3.18.3 和从源代码编译的 Qt 5.15.1。用于编译 Qt 的命令是:

"%QT_SRC%\configure" -prefix "%QT_OUT%" -platform win32-msvc -opengl desktop -make libs -nomake examples -nomake tests -skip qtwebengine -opensource
nmake    
nmake install

我的尝试都针对 Visual Studio 2017。

标签: qtcmakeautomoc

解决方案


推荐阅读