Cmake建立一个小型库的问题

时间:2017-10-03 17:28:48

标签: build cmake

我目前正在努力加深对CMake的理解。我尝试在我的C ++项目中使用http://libqglviewer.com/introduction.html]LibQGLViewer作为第三方库。

关联子目录中的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)

我的应用程序运行,一切都很好。

但是,我读到应该只包含带有add_library的源文件,然后使用 target_include_directories 来考虑相关的头文件。所以我将上面的部分改为

add_library(${target_name} SHARED ${QGLsources})
target_include_directories(${target_name} 
  PUBLIC 
    ${PROJECT_SOURCE_DIR}/QGLViewer 
    ${PROJECT_SOURCE_DIR}/QGLViewer/VRender
  )

但现在,我在尝试制作项目时遇到错误

致命错误:QGLViewer / qglviewer.h:没有这样的文件或目录 编译终止。

你可以告诉我吗

  • PUBLIC究竟是什么?做?我知道PUBLIC做了什么,但重点是什么意思?
  • 为什么它不像以前那样起作用?

提前谢谢

PS:文件夹结构如下

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

第一个,target_include_directories()根据official docs target_include_directories(<target> [SYSTEM] [BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])具有以下语法,因为您看到可能会使用的关键字很少:

  • PRIVATE:将目录添加到INCLUDE_DIRECTORIES
  • <target>属性
  • INTERFACE:将目录添加到INTERFACE_INCLUDE_DIRECTORIES
  • <target>属性
  • PUBLIC:将目录添加到INCLUDE_DIRECTORIES
  • 的<{1}} INTERFACE_INCLUDE_DIRECTORIES属性

那些属性怎么样:

  • <target> - 包含搜索您在项目中使用的标题文件的目录列表
  • INCLUDE_DIRECTORIES - 包含搜索头文件的目录列表,它有transitivity,这意味着您可以通过{{继承您的include目录到项目链接1}}

第二个,您的代码无法正常工作,因为您正在使用其他包含文件夹路径,您的源文件必须包含INTERFACE_INCLUDE_DIRECTORIES之类的内容,但由于您不再包含根文件夹({{1}在您之前的代码中),但直接链接QGLViewer - 您必须键入target_link_libraries()。为您使用的每个#include <QGLViewer/qglviewer.h>修复此问题,或者将.添加到#include <qglviewer.h>