CMake 添加导出配置

在安装和测试过程中,我们增加了 CMake 安装库文件和项目依赖的头文件(bin、lib、include)的能力。在打包可安装程序的过程中,我们增加了打包这些信息的能力,这样它就可以分发给其他人使用 接下来是如何添加必要的信息,以便其他 CMake 项目可以使用我们的项目,无论是在构建目录、本地安装还是打包的时候 第一步是更新我们的 install(TARGETS) 命令,不仅指定 DESTINATION,还指定 EXPORT。EXPORT 关键字生成一个 CMake 文件,其中包含从安装树导入安装命令中列出的所有目标的代码。 修改 MathFunctions/CMakeLists.txt 文件代码: # install rules set(installable_libs MathFunctions tutorial_compiler_flags)if(TARGET SqrtLibrary) list(APPEND installable_libs SqrtLibrary)endif()install(TARGETS ${installable_libs} EXPORT MathFunctionsTargets DESTINATION lib)install(FILES MathFunctions.h DESTINATION include)第二步我们还需要显式地安装生成的 MathFunctionsTargets.cmake 文件。在顶层的 CMakeLists.txt 文件底部添加如下代码: install(EXPORT MathFunctionsTargets FILE MathFunctionsTargets.cmake DESTINATION lib/cmake/MathFunctions )此时构建会有下面的错误: 这是因为在生成导出信息期间,它将导出内在绑定到当前计算机项目的路径,在其他计算机上路径无效。 第三步更新 MathFunctions/CMakeLists.txt 中的 target_include_directories() 用来设置在 build 时和在 install/package 时需要使用不同的 INTERFACE locations。 # 将当前二进制目录添加到包含目录列表中 target_include_directories(MathFunctions # INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:include> )第四步我们还需要生成一个 MathFunctionsConfig.cmake,这样 CMake 的 find_package() 命令就可以找到我们的项目。在顶层的项目目录添加 Config....

March 6, 2022 · 4 min · Rick Cui

CMake 添加生成器表达式

target_compile_features target_compile_options COMPILE_LANG_AND_ID BUILD_INTERFACE 生成器表达式(Generator expressions)允许在许多目标属性的上下文中使用,比如 LINK LIBRARIES、INCLUDE DIRECTORIES、COMPILE DEFINITIONS 等。当使用命令来填充这些属性时,它们也可以被使用,例如 target_link_libraries()、target_include_directories()、target_compile_definitions() 等。 生成器表达式可以用于启用条件链接、编译时使用的条件定义、条件包含目录等。这些条件可能基于构建配置、目标属性、平台信息或任何其他可查询的信息。 有不同类型的生成器表达式,包括逻辑表达式、信息表达式和输出表达式。 逻辑表达式用于创建条件输出。基本的表达式是 0 和 1 表达式。 生成器表达式的一个常见用法是有条件地添加编译器标志,比如那些用于语言级别或警告的标志。一个很好的模式是将该信息关联到一个 INTERFACE 目标,从而允许该信息传播。让我们先构造一个接口目标,并指定所需的 c++ 标准 11,而不是使用 CMAKE CXX 标准。 # 指定 C++ 标准 # set(CMAKE_CXX_STANDARD 11) # set(CMAKE_CXX_STANDARD_REQUIRED True) # 将上面的代码替换为 add_library(tutorial_compiler_flags INTERFACE)target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)接下来,我们为项目添加所需的编译器警告标志。由于警告标志因编译器的不同而不同,我们使用 COMPILE_LANG_AND_ID 生成器表达式来控制给定语言和一组编译器 ID 要应用哪些标志(注:将要使用的生成器表达式是在 3.15 中引入的,所以要更新 cmake_minimum_required 的版本为 3.15),如下所示: set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>")set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")target_compile_options(tutorial_compiler_flags INTERFACE "$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>" "$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>" )我们看到警告标志被封装在一个 BUILD_INTERFACE 条件中。这样做是为了让我们已安装项目的使用者不会继承我们的警告标志。 修改 Mathfunctions/cmakelists.txt,以便所有编译目标都有一个 target_link_libraries() 调用我们设置的编译条件标识 tutorial_compiler_flags。...

March 6, 2022 · 2 min · Rick Cui

CMake 静态库和动态库混合使用

将原来的 静态库 MathFunctions拆分为动态库 MathFunctions.dll 和静态库 SqrtLibrary.lib 两个库。MathFunctions.dll 动态库会使用 SqrtLibrary.lib 静态库。 BUILD_SHARED_LIBS 在顶层的 CMakeLists.txt 文件中添加 BUILD_SHARED_LIBS,如果这个标记存在且为真,则将导致所有库都被构建为共享库,除非该库被显式地设置为静态库。这个变量通常作为 option() 添加到项目中,以便项目的每个用户可以决定他们是要使用共享库还是静态库构建项目。 顶层的 CMakeLists.txt 文件修改如下: # 设置CMake版本最低要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称和版本 project(Tutorial VERSION 3.2)# 指定 C++ 标准 set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED True)# control where the static and shared libraries are built so that on windows # we don't need to tinker with the path to run the executable # 指定静态库和动态库的生成路径 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")# 生成共享库选项 option(BUILD_SHARED_LIBS "Build using shared libraries" ON)# 生成一个头文件,传递 CMake 的一些设置到源代码 configure_file(TutorialConfig....

March 5, 2022 · 2 min · Rick Cui

CMake 添加对测试仪表板的支持

向仪表板提交测试结果 1. 修改最上层的 CMakeLists.txt 文件 将 enable_testing() 替换为 include(CTest),CTest 模块会自动调用 enable_testing() # 设置CMake版本最低要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称和版本 project(Tutorial VERSION 3.1)# 指定 C++ 标准 set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED True)# 设置编译选项 option(USE_MYMATH "Use tutorial provided math implementation" ON)# 生成一个头文件,传递 CMake 的一些设置到源代码 configure_file(TutorialConfig.h.in TutorialConfig.h)# 添加 MathFunctions library # add_subdirectory(MathFunctions) if(USE_MYMATH) add_subdirectory(MathFunctions) list(APPEND EXTRA_LIBS MathFunctions)endif()# 添加源码文件和生成的目标文件的名称 add_executable(Tutorial main.cpp)# target_link_libraries(Tutorial PUBLIC MathFunctions) target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})# 添加头文件查找路径 # target_include_directories(Tutorial PUBLIC # "${PROJECT_BINARY_DIR}" # "${PROJECT_SOURCE_DIR}/MathFunctions" # ) target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" )## 安装 install(TARGETS Tutorial DESTINATION bin)install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig....

March 3, 2022 · 2 min · Rick Cui

CMake 打包可安装程序

可以在各种平台上提供二进制和源代码发行版。 InstallRequiredSystemLibraries CPack 一、需要在顶层 CMakeLists.txt 文件的底部添加几行代码 # 设置CMake版本最低要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称和版本 project(Tutorial VERSION 3.1)# 指定 C++ 标准 set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED True)# 设置编译选项 option(USE_MYMATH "Use tutorial provided math implementation" ON)# 生成一个头文件,传递 CMake 的一些设置到源代码 configure_file(TutorialConfig.h.in TutorialConfig.h)# 添加 MathFunctions library # add_subdirectory(MathFunctions) if(USE_MYMATH) add_subdirectory(MathFunctions) list(APPEND EXTRA_LIBS MathFunctions)endif()# 添加源码文件和生成的目标文件的名称 add_executable(Tutorial main.cpp)# target_link_libraries(Tutorial PUBLIC MathFunctions) target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})# 添加头文件查找路径 # target_include_directories(Tutorial PUBLIC # "${PROJECT_BINARY_DIR}" # "${PROJECT_SOURCE_DIR}/MathFunctions" # ) target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" )## 安装 install(TARGETS Tutorial DESTINATION bin)install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig....

March 1, 2022 · 1 min · Rick Cui