使用不同文件夹上的文件来刷新AUTOMOC

Mac*_*Mac 3 c++ qt cmake moc

我有一个简单的CMake项目:

proj (project folder)
??? a.h
??? a.cpp
??? CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

的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})
Run Code Online (Sandbox Code Playgroud)

啊:

#pragma once

#include <QObject>

class A : public QObject
{
    Q_OBJECT
public:
    explicit A(QObject *parent = 0);
};
Run Code Online (Sandbox Code Playgroud)

a.cpp:

#include "a.h"

A::A(QObject *parent) : QObject(parent)
{
}
Run Code Online (Sandbox Code Playgroud)

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

proj (project folder)
??? include
?   ??? a.h
??? src
?   ??? a.cpp
??? CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

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

include_directories("include")
include_directories("src")

set( proj_SOURCE
    src/a.cpp
)
Run Code Online (Sandbox Code Playgroud)

不管我做什么都没关系,编译失败了

a.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl A::metaObject(void)const
" (?metaObject@A@@UEBAPEBUQMetaObject@@XZ) [C:\Users\me\AppData\Local\Temp\subclass\build\proj.vcxproj]
a.obj : error LNK2001: unresolved external symbol "public: virtual void * __cdecl A::qt_metacast(char const *)" (?qt_metacast@A
@@UEAAPEAXPEBD@Z) [C:\Users\me\AppData\Local\Temp\subclass\build\proj.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:\Users\me\AppData\Local\Temp\subclass\build\proj.vcxproj]
C:\Users\me\AppData\Local\Temp\subclass\build\Debug\proj.exe : fatal error LNK1120: 3 unresolved externals [C:\Users\me\Ap
pData\Local\Temp\subclass\build\proj.vcxproj]
Run Code Online (Sandbox Code Playgroud)

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

Mac*_*Mac 5

从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})
Run Code Online (Sandbox Code Playgroud)