文章

cmake问题记录

  1. cmake 输出相关信息
    message(STATUS "CMake version: ${CMAKE_VERSION}") message(STATUS "CMake C compiler: ${CMAKE_C_COMPILER}") message(STATUS "CMake CXX compiler: ${CMAKE_CXX_COMPILER}") message(STATUS "Build directory: ${PROJECT_BINARY_DIR}") message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
  2. 判断是否被当作subproject
    # Determine if is built as a subproject (using add_subdirectory) # or if it is the master project. if (NOT DEFINED XXX_MASTER_PROJECT) set(XXX_MASTER_PROJECT OFF) if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) set(XXX_MASTER_PROJECT ON) endif () message(STATUS "Is build as a master project: ${XXX_MASTER_PROJECT}") endif ()
  3. 生成compile_commands.json以供clangd使用
    # generate compile_commands.json set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  4. cmake设置rpath,unix下搜索同目录下的so文件
    SET(CMAKE_SKIP_BUILD_RPATH FALSE) # 加入rpath SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) # 表示编译的时候是否使用CMAKE_INSTALL_RPATH作为rpath路径 SET(CMAKE_INSTALL_RPATH "\${ORIGIN}") # 设置rpath安装时的路径,${ORIGIN}代表运行时当前目录

    参考How to set rpath origin in cmake?

  5. cmake设置输出目录,解决windows下命令行生成目录不正确但是IDE生成目录正确的问题
    一定要放在project命令后面
    set(XXX_OUTPUT_DIR ${PROJECT_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${XXX_OUTPUT_DIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${XXX_OUTPUT_DIR}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${XXX_OUTPUT_DIR}) # 显式设置debug和release目录,这样命令行模式下cmake生成的目录才得到统一 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${XXX_OUTPUT_DIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${XXX_OUTPUT_DIR}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${XXX_OUTPUT_DIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${XXX_OUTPUT_DIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${XXX_OUTPUT_DIR}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${XXX_OUTPUT_DIR})
  6. cmake开启fPIC
    if (NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE) # Otherwise we can't link .so libs with .a libs set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif()
  7. cmake统一符号可见性,默认隐藏
    if (XXX_MASTER_PROJECT AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET) set(CMAKE_CXX_VISIBILITY_PRESET hidden CACHE STRING "Preset for the export of private symbols") set_property(CACHE CMAKE_CXX_VISIBILITY_PRESET PROPERTY STRINGS hidden default) endif () if (XXX_MASTER_PROJECT AND NOT DEFINED CMAKE_VISIBILITY_INLINES_HIDDEN) set(CMAKE_VISIBILITY_INLINES_HIDDEN ON CACHE BOOL "Whether to add a compile flag to hide symbols of inline functions") endif ()
  8. 集成vcpkg toolchain
    if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) message(STATUS "VCPKG_ROOT: $ENV{VCPKG_ROOT}") set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "") endif()
  9. 集成vcpkg manifest
    一定要放在project命令之前
    if (XXX_RUN_TEST) list(APPEND VCPKG_MANIFEST_FEATURES "tests") endif() if (XXX_BUILD_EXAMPLES) list(APPEND VCPKG_MANIFEST_FEATURES "examples") endif() if (XXX_BUILD_BENCHMARKS) list(APPEND VCPKG_MANIFEST_FEATURES "benchmarks") endif()
  10. ctest集成gtest
    enable_testing() file(GLOB_RECURSE source CONFIGURE_DEPENDS *.h *.cpp) find_package(GTest CONFIG REQUIRED) add_executable(test_main ${source}) target_link_libraries(test_main PRIVATE GTest::gtest) include(GoogleTest) gtest_discover_tests(test_main WORKING_DIRECTORY ${XXX_OUTPUT_DIR})
本文由作者按照 CC BY 4.0 进行授权