使用CMake创建和使用库

时间:2015-03-27 23:32:39

标签: c++ cmake

我正在尝试学习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?

1 个答案:

答案 0 :(得分:2)

要匹配您指定的目录结构,您的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})

PUBLIC调用中使用target_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"