首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >建立一个小型图书馆的问题

建立一个小型图书馆的问题
EN

Stack Overflow用户
提问于 2017-10-03 17:28:47
回答 1查看 174关注 0票数 1

我目前正在努力加深对CMake的理解。在我的一个C++项目中,我尝试使用C++作为第三方库.

关联子目录中的CMakeLists.txt如下所示,我有问题的部分是add_libary部分,为了清楚起见,省略了一些头文件和源文件

代码语言:javascript
复制
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来考虑相关的头文件。因此,我将上述部分更改为

代码语言:javascript
复制
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:文件夹结构如下

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46550230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档