我的应用项目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
答案 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")