我想学习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?
为了配合你指定的目录结构,你的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”文件夹是PRIVATE
到my_lib
,main.cpp中会无法#include "Internal.h"
。