2016-05-11 3 views
2

У меня есть простой проект CMake:CMake AUTOMOC с файлами на разных папках

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 
) 

dosen't от того, что я делаю компиляция завершается с вариациями

a.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl A::metaObject(void)const 
" ([email protected]@@[email protected]@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 *)" ([email protected] 
@@[email protected]) [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 * 
*)" ([email protected]@@[email protected]@@[email protected]) [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 не работает хорошо в этой конфигурации (файлы в разных папках), но, может быть, есть способ?

ответ

3

Из списка пользователей 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}) 
+0

Спасибо! Это единственное решение, которое, похоже, работает на меня! Это просто, и я не вижу недостатка в этом ... также, переменная 'HEADERS'' qmake' читается так, как если бы она помещала эти файлы заголовков в проект, что еще больше подсказывает ваш путь – IceFire