我有一个 Qt widget C++ 类,可以加载在 Qt Creator 中创建的 ui 文件。该类的头文件和源文件存储在两个不同的目录中。我无法指示 cmake/automoc 找到该类的头文件。cmake 可以识别需要 moc 该 C++ 文件,但找不到相应的头文件。
是否有什么方法可以帮助 cmake 找到这些文件?
如果 cpp 和头文件在同一个目录中,一切都正常运行。只有当头文件在其他位置时才会出现此问题。
我的目录结构是
project
src
include
Foo
Bar.h
lib
Foo
Bar.cpp
forms
Bar.ui
在 src/include/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"
我在src/lib/Foo目录下的CMakeLists.txt文件设置如下:
# 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时,出现以下错误:AUTOGEN:错误:/ automoc / src / lib / Foo / Bar.cpp文件包括moc文件“moc_Bar.cpp”,但在/ automoc / src / lib / Foo /中找不到标题为“Bar{.h,.hh,.h++,.hm,.hpp,.hxx,.in,.txx}”的头文件。
find_package(Qt5Widget)
,那么就没有必要再使用find_package(Qt5Core)
)。但我认为错误在于你需要包含ui_Bar.h
而不是*.cpp
文件。请参考示例。 - user2288008qt5_wrap_ui
和qt5_wrap_cpp
来使用显式定义的文件...如果您在此期间找到解决方案,请告诉我。 - MOnsDaR