open full creator qt cmake qt5 moc

qt - full - Cómo instruir a cmake/automoc para encontrar encabezado externo



qt creator (1)

Tengo un widget Qt clase C ++ que carga un archivo ui creado en Qt Creator. El encabezado y el archivo fuente de la clase viven en dos directorios separados. Tengo problemas para instruir a cmake / automoc para encontrar el encabezado de la clase. cmake reconoce que necesita moccionar el archivo C ++ pero no puede encontrar el encabezado análogo.

¿Hay algo que pueda hacer para ayudar a encontrar los archivos?

Todo funciona bien si tanto el cpp como el archivo de cabecera están en el mismo directorio. Esto solo aparece cuando los encabezados están en otra parte.

Mi estructura de directorio es

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

En src / include / Foo / Bar.h tengo:

// Bar.h #include <QtWidgets/QWidget> namespace Ui { class Bar; } class Bar : public QWidget { Q_OBJECT ... }

En el archivo src / Foo / Bar.cpp:

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

Mi CMakeLists.txt en src / lib / Foo está configurado de la siguiente manera:

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

Cuando ejecuto cmake, obtengo el siguiente error:

AUTOGEN: error: /automoc/src/lib/Foo/Bar.cpp El archivo incluye el archivo moc "moc_Bar.cpp", pero no pudo encontrar el encabezado "Bar {.h, .hh, .h ++ ,. hm, .hpp , .hxx, .in, .txx} "en / automoc / src / lib / Foo /


Pruebe el siguiente truco:

1) Coloque ambos .h y .cpp originales en la carpeta fuente de la biblioteca:

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

2) en el directorio de inclusión público, crea otra barra.h:

src include Foo Bar.h

Con el contenido:

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

Ejemplo real de este enfoque https://github.com/paceholder/nodeeditor/tree/master/include/nodes