2015-02-13 13 views
9

Ho una classe C++ del widget Qt che carica un file ui creato in Qt Creator. L'intestazione e il file di origine per la classe vivono in due directory separate. Ho difficoltà a istruire cmake/automoc per trovare l'intestazione per la classe. cmake riconosce che ha bisogno di moc il file C++ ma non riesce a trovare l'intestazione analoga.Come istruire cmake/automoc per trovare l'header esterno

C'è qualcosa che posso fare per aiutare cmake a trovare i file?

Tutto funziona correttamente se sia il cpp che il file di intestazione si trovano nella stessa directory. Questo emerge solo quando le intestazioni sono altrove.

La mia struttura di directory è

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

In src/include/Foo/Bar.h ho:

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

namespace Ui { class Bar; } 

class Bar : public QWidget { 
    Q_OBJECT 
    ... 
} 

Nel file/Foo/Bar.cpp src:

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

My CMakeLists.txt in src/lib/Foo è impostato come segue:

# 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}) 

Quando eseguo CMake, ottengo il seguente errore:

AUTOGEN: errore: /automoc/src/lib/Foo/Bar.cpp Il file include il file moc "moc_Bar.cpp", ma non poteva trova l'intestazione "Bar {.h, .hh, .h ++ ,. hm, .hpp, .hxx, .in, .txx}" in/automoc/src/lib/Foo/

+0

Un sacco di roba nel codice non necessario (es non è necessario in 'find_package (Qt5Core)' se stai già usando 'find_package (Qt5Widget)'). Ma penso che l'errore è che devi includere file 'ui_Bar.h' ma non' * .cpp'. Vedi [esempio] (https://github.com/forexample/qt-cmake/tree/master/TextFinder) –

+0

Questo è stato solo un errore quando stavo ridigitando il codice dal caso di test reale che ho creato per riprodurre il problema. Il codice reale include l'intestazione, non il cpp. Grazie per averlo preso; Ho corretto la domanda. – user2180977

+0

BTW, ho provato ad utilizzare alcune delle altre funzionalità automatiche (di cui non ero a conoscenza) come autouic eseguendo set (CMAKE_AUTOUIC ON), ma che è fallito miseramente, visto che cerca solo il file ui nella stessa directory dove vive Bar.cpp; non riesce a capire che si trova in una directory separata (moduli). – user2180977

risposta

0

Provare il trucco seguente:

1) Mettere sia .he cpp originale e nella cartella di origine libreria:

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

2) nel pubblico includono directory creare un altro Bar.h:

src 
    include 
     Foo 
      Bar.h 

Con il contenuto:

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

reale esempio di questo approccio https://github.com/paceholder/nodeeditor/tree/master/include/nodes

Problemi correlati