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