创建和使用库的CMake(Creating and using a library with CMa

2019-10-22 10:24发布

我想学习CMake的,但我不能得到与可用的教程交手。

比方说,我的项目有以下的结构,我想通过它CMakeLists文件,以使my_lib可在我main.cpp中使用它,将我的CMakeLists文件是什么样子?

├── CMakeLists.txt
├── externals
│   └── my_lib
│       └── src
│           ├── CMakeLists.txt
│           ├── MyClass.h
│           └── MyClass.cpp
└── main.cpp

我应该使用include_directories或add_subdirectory?

Answer 1:

为了配合你指定的目录结构,你的CMakeLists.txt文件看起来是这样的:

/CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project(Main)
add_subdirectory(externals/my_lib/src)
add_executable(my_main main.cpp)
target_link_libraries(my_main my_lib)

/externals/my_lib/src/CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project(MyLib)
add_library(my_lib MyClass.cpp MyClass.h)
target_include_directories(my_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

使用PUBLICtarget_include_directories调用意味着不仅您的图书馆都有这个“包含路径”,但这样做的任何目标链接到它。

然而,这种设置的缺点是,你也将暴露的任何内部接头my_lib到消费的目标了。 假设你也有一个“Internal.h”作为其一部分my_lib您不希望暴露。 您可以通过有意公开头移动到一个单独的文件夹做到这一点,例如,“包括”:

├── CMakeLists.txt
├── externals
│   └── my_lib
│       ├── CMakeLists.txt
│       ├── include
│       │   └── MyClass.h
│       └── src
│           ├── Internal.h
│           └── MyClass.cpp
└── main.cpp

您顶级的CMakeLists.txt不会改变,但/externals/my_lib/CMakeLists.txt(已上升一个级别)现在读:

cmake_minimum_required(VERSION 3.0)
project(MyLib)
add_library(my_lib src/MyClass.cpp src/Internal.h include/MyClass.h)
target_include_directories(my_lib
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
    )

现在,由于图书馆的“SRC”文件夹是PRIVATEmy_lib ,main.cpp中会无法#include "Internal.h"



文章来源: Creating and using a library with CMake
标签: c++ cmake