CMake 教程 - 第三步:为库添加使用配置
练习 1 - 为库添加使用要求
目标
通过以下代码,可以更好地个性化控制库或可执行文件的链接和包含行,同时也增强了目标在 CMake 中的传递性质。主要使用的命令包括:
target_compile_definitions
target_compile_options
target_include_directories
target_link_directories
target_link_options
target_precompile_headers
target_sources
需要编辑的文件
MathFunctions/CMakeLists.txt
CMakeLists.txt
步骤
- 在
MathFunctions
库中添加包含目录:# TODO 1: MathFunctions/CMakeLists.txt # 将当前目录添加到 MathFunctions 的接口包含目录中 # 并且MathFunctions指定被其他的目标链接时,会将这个目录添加到包含目录中 # INTERFACE表示包含目录将应用于目标及其使用该目标的其他目标。 # 其他目标使用MathFunctions的库时不担心库中有需要额外添加的目录 target_include_directories(MathFunctions INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
- 在顶层
CMakeLists.txt
文件中删除额外添加的包含目录add_subdirectory
调用:# TODO : CMakeLists.txt # 移除对"${PROJECT_SOURCE_DIR}/MathFunctions的使用,因为连接库时会自动添加该包含目录 target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/MathFunctions")
使用这种技术,只需调用 target_link_libraries
并使用库目标的名称。但是在更大的项目中,手动指定库依赖关系的经典方法很快就会变得非常复杂。
练习 2 - 配置接口库
- 在顶层
CMakeLists.txt
文件中利用接口库定义全局可用的内容:#注释c++标准设置,将其封到接口库tutorial_compiler_flags中 # c++17中sqrt不必include cmath # set(CMAKE_CXX_STANDARD 17) # set(CMAKE_CXX_STANDARD_REQUIRED True) # 生成一个接口库,这类库不编译任何文件,也不在磁盘上产生库文件 add_library(tutorial_compiler_flags INTERFACE) target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)
- 在
MathFunctions/CMakeLists.txt
中添加对接口库的使用target_link_libraries(SqrtLibrary PUBLIC tutorial_compiler_flags) target_link_libraries(MathFunctions PUBLIC tutorial_compiler_flags) # 两个库都使用接口的配置