CMake AUTOMOC使用不同文件夹中的文件

CMake AUTOMOC with files on different folders

本文关键字:文件夹 文件 AUTOMOC CMake      更新时间:2023-10-16

我有一个简单的CMake项目:

proj (project folder)
├── a.h
├── a.cpp
└── CMakeLists.txt

CMakeLists.txt:

cmake_minimum_required(VERSION 3.2)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_AUTOMOC ON)
project(proj)
set( proj_SOURCE
    a.cpp
)
find_package(Qt5Core)
set( proj_LIBRARIES
    Qt5::Core
)
add_library(proj SHARED ${proj_SOURCE})
target_link_libraries(proj ${proj_LIBRARIES})

a.h:

#pragma once
#include <QObject>
class A : public QObject
{
    Q_OBJECT
public:
    explicit A(QObject *parent = 0);
};

a.cpp:

#include "a.h"
A::A(QObject *parent) : QObject(parent)
{
}

一切都很好。接下来,我尝试将头文件和源文件移动到不同的文件夹中,如下所示:

proj (project folder)
├── include
│   └── a.h
├── src
│   └── a.cpp
└── CMakeLists.txt

并尝试了以下调用的不同配置:

include_directories("include")
include_directories("src")
set( proj_SOURCE
    src/a.cpp
)

无论我做什么,的变体都会导致编译失败

a.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl A::metaObject(void)const
" (?metaObject@A@@UEBAPEBUQMetaObject@@XZ) [C:UsersmeAppDataLocalTempsubclassbuildproj.vcxproj]
a.obj : error LNK2001: unresolved external symbol "public: virtual void * __cdecl A::qt_metacast(char const *)" (?qt_metacast@A
@@UEAAPEAXPEBD@Z) [C:UsersmeAppDataLocalTempsubclassbuildproj.vcxproj]
a.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl A::qt_metacall(enum QMetaObject::Call,int,void *
 *)" (?qt_metacall@A@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z) [C:UsersmeAppDataLocalTempsubclassbuildproj.vcxproj]
C:UsersmeAppDataLocalTempsubclassbuildDebugproj.exe : fatal error LNK1120: 3 unresolved externals [C:UsersmeAp
pDataLocalTempsubclassbuildproj.vcxproj]

我不知道我是否需要为CMake工作设置一些额外的东西,或者问题是什么。这个答案说CMake在这个配置(不同文件夹上的文件)上工作不好,但也许有办法?

从CMake用户列表:在这个特定的配置中,似乎需要将头文件添加到目标中。我仍然不知道确切的原因,但下面的代码回答了上面的问题。

cmake_minimum_required(VERSION 3.2)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_AUTOMOC ON)
project(proj)
set( proj_SOURCE
    a.cpp
)
# add this
set( proj_HEADER
    include/a.h
)
find_package(Qt5Core)
set( proj_LIBRARIES
    Qt5::Core
)
# modify this
add_library(proj SHARED ${proj_SOURCE} ${proj_HEADER})
target_link_libraries(proj ${proj_LIBRARIES})