为了匹配您指定的目录结构,您的 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})
在target_include_directories 调用中使用PUBLIC 意味着您的库不仅将其作为“包含路径”,而且任何链接到它的目标也是如此。
但是,此设置的缺点是您还将向消费目标公开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"。