【问题标题】:Directory Structure for Library CMake Projects库 CMake 项目的目录结构
【发布时间】:2014-10-06 14:00:46
【问题描述】:

我有一个应用程序项目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 

【问题讨论】:

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


    【解决方案1】:

    如果你想像这样访问你的标题:

    #include <matrix.hpp>
    

    那么你需要包含目录。我建议你下一个:

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

    您的错误是您从未在全局范围内定义 Hello_INCLUDE_DIRS 变量,仅在本地范围内。所以你的 include 什么都不做。 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")
    

    【讨论】:

    • 不,我想要 &lt;Hello/matrix.hpp&gt; 在 hello 库之外,就像普通的 3rd 方库一样。但是在Hello 里面可以有&lt;matrix.hpp&gt;
    • 没问题。将 INCLUDE_DIRECTORIES(${Project_Source_Dir}/Hello/includes) 添加到另一个地方并访问您的细节 matrix.hpp。 :D
    • 抱歉,我没有收到您所说的INCLUDE_DIRECTORIES 是在Hello/CMakeLists.txt 内部,对吧?现在的问题是我希望其他应用程序使用相同的库,例如Demo。这样我如何在这些项目中使用#include &lt;Hello/matrix.hpp&gt;
    • 检查编辑。我已经添加了hallo/includes/hallo 这是一种练习的风格吗?
    • 那么您是在向SET(Hello_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/Include) 发送Hello/CMakeLsts.txt 吗?这将在Demo/CMakeLists.txtADD_SUBDIRECTORY 中自动可用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2016-06-18
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多