加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 图书馆CMake项目的目录结构

发布时间:2020-12-16 07:09:30 所属栏目:百科 来源:网络整理
导读:我有一个应用程序项目Demo,它依赖于我的共享库Hello.库Hello应该是可再发行的.所以我需要分发Hello的标题以及在我的Demo项目中使用它.我应该使用什么目录结构和CMake配置?我以前有一个扁平的结构,Hello是一个只有头的子目录,没有CMakeLists.txt.现在我正在
我有一个应用程序项目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也将用于其他应用程序和库.

演示/ 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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读