qt - 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。
解决方案
推荐阅读
- swift - 在 Swift 5 中创建和编写子目录时出现问题
- python - 尝试编写最近邻算法 - 欧几里得距离函数只计算测试集的一行的距离 - 为什么?
- javascript - 如何将 base64 图像数据发布到 Discord webhook(不使用 discord.js)?
- python - 当某些列表包含 Null 值时,如何展平列表列?
- python - 多行输出到一个命令
- python - 创建使用另一列中的字符串映射字典的数据框
- azure - 如何在 Spring Cloud Stream 中使用 2 个 Azure 事件中心
- postman - 如何在 netsuite 中支付特定发票?使用客户付款
- html - 如何将每个孩子与第 n 个孩子同时定位在 flex/grid/whatever 中?
- javascript - 类型'{ props: ReactNode; 上不存在属性'className' }'