图书馆CMake项目的目录结构

时间:2014-08-13 09:09:21

标签: c++ cmake shared-libraries directory-structure

我的应用项目Demo取决于我的共享库Hello。库Hello应该是可再发行的。所以我需要分发Hello的标题以及在我的Demo项目中使用它。我应该使用什么目录结构和CMake配置?我之前有一个扁平的结构,Hello是一个只有头的子目录,没有CMakeLists.txt。现在我正在计划这个目录结构。

Demo
    main.cpp
    app.h
    app.cpp
    CMakeLists.txt
    Hello
       includes
           matrix.hpp          // header only
           diagonal.hpp
           point.hpp
           store.h
           analyzer.h
       sources
           store.cpp
           alanyzer.cpp
       CMakeLists.txt

以前,分析器只是标题,现在在标题和源中分割。我正在混合只有标头的东西。这是一个很好的结构吗?但我更喜欢使用漂亮的#include <Hallo/matrix.hpp>而不是丑陋的#include "Hallo/includes/matrix.hpp"#include "matrix.hpp"。我希望这个库Hello也将用于其他应用程序和库。

Demo/CMakeList.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(Demo)
ADD_SUBDIRECTORY(Demo)

SET(Demo_HEADERS
  app.h
)

SET(Demo_SOURCES
  app.cpp
  main.cpp
)

INCLUDE_DIRECTORIES(${Hello_INCLUDE_DIRS})
# ^^^^ Is this how I need to access the headers ? or just ADD_SUBDIRECTORY() will work

ADD_EXECUTABLE(Demo ${Demo_SOURCES} ${Demo_HEADERS})

TARGET_LINK_LIBRARIES(Demo Hello)

您好/的CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(Hello)

FIND_PACKAGE(Boost COMPONENTS filesystem program_options thread system serialization date_time chrono REQUIRED)

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})

SET(Hello_SOURCES
  store.cpp
  analyzer.cpp
)

INCLUDE_DIRECTORIES((${HELLO_SOURCE_DIR}/includes)
# ^^^^ Is this how I need to access the headers ?

ADD_LIBRARY(Hello ${Hello_SOURCES})

TARGET_LINK_LIBRARIES(Hello ${Boost_LIBRARIES})

我对这一切感到困惑,因为没有一种具体方法可以做到这一切。

---编辑---

我应该有这种结构吗?或者其他一些库通常使用这种结构吗?或者通常采用的结构是什么?

hallo
  includes
    hallo
  sources 

1 个答案:

答案 0 :(得分:1)

如果您想要像这样访问标题:

#include <matrix.hpp>

然后你需要包含目录。我建议你下一个:

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/Hello/includes)

您的错误是您从未在全局范围内定义Hello_INCLUDE_DIRS变量,仅在本地定义。所以你的包括什么都不做。始终定义CMAKE_SOURCE_DIR并且可以安全地用于包含。因此,您需要在全局范围内定义Hello_INCLUDE_DIRS或使用INCLUDE_DIRECTORIES($ {CMAKE_SOURCE_DIR} / Hello / includes)。

用法取决于开发人员。我更喜欢这种结构:

+ Project Root
+-> Build
+-> Documentation
+-> Include
+-> Source
+-> Test
+ CMakeLists.txt

然后我可以在根CMakeLists.txt中预设下一个有用的变量:

SET(Project_Include_Dir         "${CMAKE_SOURCE_DIR}/Include")
SET(Project_Source_Dir          "${CMAKE_SOURCE_DIR}/Source")