2015-02-13 6 views
9

У меня есть Qt-виджет C++-класса, который загружает файл ui, созданный в Qt Creator. Заголовок и исходный файл для класса живут в двух отдельных каталогах. У меня проблемы с инструкцией cmake/automoc, чтобы найти заголовок для класса. cmake распознает, что ему нужен файл C++, но он не может найти аналогичный заголовок.Как указать cmake/automoc найти внешний заголовок

Есть ли что-то, что я могу сделать, чтобы помочь cmake найти файлы?

Все работает нормально, если оба cpp и заголовочный файл находятся в одном каталоге. Это происходит только тогда, когда заголовки находятся в другом месте.

Моя структура каталогов

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

В ЦСИ/включить/Foo/bar.h у меня есть:

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

namespace Ui { class Bar; } 

class Bar : public QWidget { 
    Q_OBJECT 
    ... 
} 

В Src/Foo/Bar.cpp файла:

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

My CMakeLists.txt в src/lib/Foo настроен следующим образом:

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

Когда я бегу CMake, я получаю следующее сообщение об ошибке:

автоген: ошибка: /automoc/src/lib/Foo/Bar.cpp Файл содержит MOC файл «moc_Bar.cpp», но не смог найти заголовок "Bar {.h, .hh, .h ++, hm, .hpp, .hxx, .in, .txx}" in/automoc/src/lib/Foo/

+0

Много материала в вашем коде не необходимо (например, в 'find_package (Qt5Core) нет необходимости, если вы уже используете' find_package (Qt5Widget) '). Но я думаю, что ошибка заключается в том, что вам нужно включить файлы 'ui_Bar.h', но не' * .cpp'. См. [Пример] (https://github.com/forexample/qt-cmake/tree/master/TextFinder) –

+0

Это была ошибка, когда я перепечатывал код из фактического тестового примера, который я создал для воспроизведения проблемы. Реальный код включает заголовок, а не cpp. Спасибо, что поймали его; Я исправил вопрос. – user2180977

+0

BTW, я пробовал использовать некоторые из других возможностей авто (которые я не знал), таких как autouic, выполнив set (CMAKE_AUTOUIC ON), но это тоже не получилось, поскольку он ищет только файл ui в том же каталоге где Bar.cpp живет; он не может понять, что он находится в отдельном каталоге (формах). – user2180977

ответ

0

Попробуйте следующий трюк:

1) Положите как оригинальный .h и .cpp в исходной папке библиотеки:

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

2) в обществе включает каталог создать другой bar.h:

src 
    include 
     Foo 
      Bar.h 

С содержанием:

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

Реального примером такого подхода https://github.com/paceholder/nodeeditor/tree/master/include/nodes

Смежные вопросы