【问题标题】:CMake AUTOMOC with files on different foldersCMake AUTOMOC 与不同文件夹中的文件
【发布时间】:2016-05-11 00:34:53
【问题描述】:

我有一个简单的 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})

啊哈:

#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:\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]

我不知道我是否需要为 CMake 设置额外的东西才能正常工作或问题出在哪里。 This 回答说 CMake 在这种配置(不同文件夹中的文件)上效果不佳,但也许有办法?

【问题讨论】:

    标签: c++ qt cmake moc


    【解决方案1】:

    来自 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})
    

    【讨论】:

    • 谢谢!这是唯一对我有用的解决方案!它很简单,我认为它没有任何缺点......另外,qmakeHEADERS 变量读起来好像它也会将这些头文件放入项目中,这更建议你的方式
    猜你喜欢
    • 1970-01-01
    • 2014-02-23
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2016-10-21
    相关资源
    最近更新 更多