我目前正在努力加深对CMake的理解。在我的一个C++项目中,我尝试使用C++作为第三方库.
关联子目录中的CMakeLists.txt如下所示,我有问题的部分是add_libary部分,为了清楚起见,省略了一些头文件和源文件
cmake_minimum_required (VERSION 3.5.1 FATAL_ERROR)
set(target_name QGLViewerQt5)
project(${target_name})
message(STATUS "BUILDING QGLViewer-2.7.0 FROM SOURCE!")
set(BASE_DIR QGLViewer)
set(VRENDER_DIR VRender)
set(CMAKE_AUTOMOC ON)
set(QGLheaders
${BASE_DIR}/camera.h
${BASE_DIR}/config.h
${BASE_DIR}/${VRENDER_DIR}/AxisAlignedBox.h
${BASE_DIR}/${VRENDER_DIR}/Exporter.h
)
set(QGLsources
${BASE_DIR}/camera.cpp
${BASE_DIR}/${VRENDER_DIR}/Exporter.cpp
)
add_library(${target_name} ${QGLsources} ${QGLheaders})
target_include_directories(${target_name}
PUBLIC .
)
target_link_libraries(${target_name}
${OPENGL_LIBRARIES}
Qt5::Core
Qt5::Widgets
Qt5::Xml
Qt5::OpenGL
)
set(CMAKE_AUTOMOC OFF)
install(TARGETS ${target_name} DESTINATION lib)我的应用程序运行,一切都很好。
但是,我读到应该只包含带有target_include_directories的源文件,然后使用add_library来考虑相关的头文件。因此,我将上述部分更改为
add_library(${target_name} SHARED ${QGLsources})
target_include_directories(${target_name}
PUBLIC
${PROJECT_SOURCE_DIR}/QGLViewer
${PROJECT_SOURCE_DIR}/QGLViewer/VRender
)但是现在,我在做我的项目时出错了
致命错误: QGLViewer/qglviewer.h:没有终止此类文件或目录编译。
你能告诉我
先谢谢你
PS:文件夹结构如下


发布于 2017-10-03 22:13:39
首先,target_include_directories()根据官方文件 target_include_directories(<target> [SYSTEM] [BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])有如下语法,您可以看到很少使用关键字:
PRIVATE:将目录添加到<target>的INCLUDE_DIRECTORIES属性INTERFACE:将目录添加到<target>的INTERFACE_INCLUDE_DIRECTORIES属性PUBLIC:将目录添加到INCLUDE_DIRECTORIES 和 INTERFACE_INCLUDE_DIRECTORIES属性<target>那么这些属性呢:
INCLUDE_DIRECTORIES -包含用于搜索项目中使用的头文件的目录列表。INTERFACE_INCLUDE_DIRECTORIES -也包含用于搜索头文件的目录列表,但是有传递性,这意味着您可以继承您的包含目录,以便通过target_link_libraries()链接项目。第二,您的代码无法工作,因为您使用的是另一个包含文件夹路径,您的源文件必须包含类似#include <QGLViewer/qglviewer.h>的内容,但由于不再包含根文件夹(在前面的代码中为.),而是直接链接QGLViewer -您必须键入#include <qglviewer.h>。为您正在使用的每个#include修复它,或者将${PROJECT_SOURCE_DIR}添加到target_include_directories中。
https://stackoverflow.com/questions/46550230
复制相似问题