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/
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) –
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
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