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