我正在尝试学习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?
答案 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"文件夹为PRIVATE
到my_lib
,main.cpp无法#include "Internal.h"
。