库CMake项目的目录结构

Directory Structure for Library CMake Projects

本文关键字:结构 CMake 项目      更新时间:2023-10-16

我有一个应用程序项目Demo,它取决于我的共享库Hello。库Hello应该是可重新分发的。所以我需要分发Hello的头,以及在我的演示项目中使用它。我应该使用什么样的目录结构和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)

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})

我对这一切有点困惑,因为没有一种特定的方法来完成这些。

—EDIT—

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

hallo
  includes
    hallo
  sources 

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

#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")