2015-02-13 10 views
9

Mam klasy C++ widget Qt, który ładuje plik ui utworzony w Qt Creator. Nagłówek i plik źródłowy klasy znajdują się w dwóch osobnych katalogach. Mam problem z poleceniem cmake/automoc, aby znaleźć nagłówek dla klasy. cmake rozpoznaje, że musi poprawić plik C++, ale nie może znaleźć analogicznego nagłówka.Jak instruować cmake/automoc, aby znaleźć zewnętrzny nagłówek

Czy jest coś, co mogę zrobić, aby pomóc cmake znaleźć pliki?

Wszystko działa poprawnie, jeśli zarówno plik cpp, jak i plik nagłówkowy znajdują się w tym samym katalogu. Pojawia się tylko wtedy, gdy nagłówki są gdzie indziej.

Moja struktura katalogów jest

project 
    src 
     include 
      Foo 
       Bar.h 
    lib 
     Foo 
      Bar.cpp 
      forms 
       Bar.ui   

w src/include/foo/Bar.h mam:

// Bar.h 
#include <QtWidgets/QWidget> 

namespace Ui { class Bar; } 

class Bar : public QWidget { 
    Q_OBJECT 
    ... 
} 

W pliku src/Foo/Bar.cpp:

#include "Foo/Bar.h" 
#include "moc_Bar.cpp" 
#include "ui_Bar.h" 

Mój CMakeLists.txt w src/lib/Foo jest skonfigurowany w następujący sposób:

# there is a project() call at the root that defines PROJECT_SOURCE_DIR 
set(PUBLIC_HEADERS_DIR ${PROJECT_SOURCE_DIR}/src/include) 

# Pick up public library headers 
include_directories(${PUBLIC_HEADERS_DIR}) 

# Pick up private headers in library dir  
include_directories(${CMAKE_CURRENT_SOURCE_DIR}) 

# Set up Qt 
set(CMAKE_AUTOMOC ON)      
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
find_package(Qt5Core REQUIRED) 
find_package(Qt5Gui REQUIRED) 
find_package(Qt5Widgets REQUIRED) 
include_directories(${Qt5Core_INCLUDE_DIRS}) 
include_directories(${Qt5Gui_INCLUDE_DIRS}) 
include_directories(${Qt5Widgets_INCLUDE_DIRS}) 
add_definitions(${Qt5Widgets_DEFINITIONS}) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") 

# Set up Qt forms/resources 
qt5_wrap_ui(UI_OUT_FILES forms/Bar.ui) 
qt5_add_resources(RESOURCE_FILE resources.qrc) 

# Library cpp and header files 
set(CORE_CPP_FILES Bar.cpp) 
set(LIB_CPP_FILES ${LIB_CPP_FILES} ${CORE_CPP_FILES} ${UI_OUT_FILES} ${RESOURCE_FILE}) 
set(LIB_HEADER_FILES ${PUBLIC_HEADERS_DIR}/Foo/Bar.h) 

# Build library 
add_library(Foo SHARED ${LIB_CPP_FILES} ${LIB_HEADER_FILES}) 
target_link_libraries(Foo ${Qt5Widgets_LIBRARIES}) 

Kiedy biegnę cmake, pojawia się następujący błąd:

autogenny: error: /automoc/src/lib/Foo/Bar.cpp Plik zawiera MOC plik "moc_Bar.cpp", ale nie mógł znaleźć nagłówek "Bar {.h, .hh, .h ++ ,. hm, .hpp, .hxx, .in, .txx}" w/automoc/src/lib/Foo/

+0

Wiele rzeczy w kodzie nie potrzebne (np nie ma potrzeby w 'find_package (Qt5Core)' jeśli już używasz 'find_package (Qt5Widget)'). Ale myślę, że błąd polega na tym, że musisz dołączyć pliki "ui_Bar.h", ale nie "* .cpp". Zobacz [przykład] (https://github.com/forexample/qt-cmake/tree/master/TextFinder) –

+0

To był tylko błąd podczas ponownego wpisywania kodu z rzeczywistego przypadku testowego, który zbudowałem, aby odtworzyć problem. Prawdziwy kod zawiera nagłówek, a nie cpp. Dzięki za złapanie go; Poprawiłem pytanie. – user2180977

+0

BTW, próbowałem używać niektórych innych funkcji automatycznych (o których nie wiedziałem), takich jak autouic, wykonując set (CMAKE_AUTOUIC ON), ale to też się nie udało, ponieważ szuka tylko pliku ui w tym samym katalogu gdzie mieszka Bar.cpp; nie może stwierdzić, że znajduje się w oddzielnym katalogu (formularzach). – user2180977

Odpowiedz

0

spróbuj wykonać następujące czynności trick:

1) Umieść zarówno oryginalne i .h .cpp do folderu źródłowego biblioteki:

lib 
    Foo 
     Bar.h 
     Bar.cpp 
     forms 
      Bar.ui 

2) w publicznej obejmują katalog utworzyć kolejną Bar.h:

src 
    include 
     Foo 
      Bar.h 

z treścią:

#include "../../../lib/Foo/Bar.h" 

prawdziwym przykładem tego podejścia https://github.com/paceholder/nodeeditor/tree/master/include/nodes

Powiązane problemy