You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CLion中基于CMake导出库工程供其他项目调用?

解决方案:CMake库工程导出与集成优化

1. 同时编译静态库与共享库

避免重复编译源码,推荐用OBJECT库复用编译结果:

# 定义OBJECT库,编译所有源码但不生成最终库
add_library(mylib_obj OBJECT
    src/core.cpp
    src/utils.cpp
)

# 生成静态库
add_library(mylib_static STATIC
    $<TARGET_OBJECTS:mylib_obj>
)

# 生成共享库,Windows下自动导出符号
add_library(mylib_shared SHARED
    $<TARGET_OBJECTS:mylib_obj>
)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

# 给库设置统一的输出名称(可选,方便区分)
set_target_properties(mylib_static PROPERTIES OUTPUT_NAME "mylib")
set_target_properties(mylib_shared PROPERTIES OUTPUT_NAME "mylib")

2. 头文件组织与暴露规则

  • 公共头文件:仅对外暴露必要的接口头,放在项目根目录的include/mylib下(比如include/mylib/core.h、include/mylib/utils.h)
  • 私有头文件:内部实现用的头放在src目录下,不对外暴露

在CMake中配置头文件路径,确保链接项目能自动获取:

# 给OBJECT库设置头文件路径,后续静态/共享库会继承
target_include_directories(mylib_obj
    PUBLIC
        $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>  # 本地构建时的路径
        $<INSTALL_INTERFACE:include>                      # 安装后的路径
    PRIVATE
        ${PROJECT_SOURCE_DIR}/src  # 私有头仅内部可见
)

3. 配置CMake install目标(关键)

通过install指令标准化输出结构,支持其他项目用find_package快速集成:

完整install配置示例

# 安装库文件:静态库放lib,共享库(Windows下dll放bin,.a/.so放lib)
install(TARGETS mylib_static mylib_shared
    EXPORT MyLibTargets
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
)

# 安装公共头文件到include目录
install(DIRECTORY include/mylib
    DESTINATION include
)

# 导出Targets配置,供其他项目导入
install(EXPORT MyLibTargets
    FILE MyLibTargets.cmake
    NAMESPACE MyLib::
    DESTINATION lib/cmake/MyLib
)

# 生成Config.cmake和ConfigVersion.cmake(可选但推荐)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    ${PROJECT_BINARY_DIR}/MyLibConfigVersion.cmake
    VERSION 1.0.0
    COMPATIBILITY SameMajorVersion
)

configure_package_config_file(
    ${PROJECT_SOURCE_DIR}/Config.cmake.in
    ${PROJECT_BINARY_DIR}/MyLibConfig.cmake
    INSTALL_DESTINATION lib/cmake/MyLib
)

install(FILES
    ${PROJECT_BINARY_DIR}/MyLibConfig.cmake
    ${PROJECT_BINARY_DIR}/MyLibConfigVersion.cmake
    DESTINATION lib/cmake/MyLib
)

配套的Config.cmake.in模板

@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake")
check_required_components(MyLib)

4. 输出结构说明

执行cmake --install . --prefix <install_path>后,输出结构如下:

<install_path>
├── bin/
│   └── mylib.dll          # Windows共享库
├── lib/
│   ├── libmylib.a         # 静态库
│   ├── libmylib.so        # Linux共享库(Windows下可能是libmylib.dll.a)
│   └── cmake/MyLib/
│       ├── MyLibConfig.cmake
│       ├── MyLibConfigVersion.cmake
│       └── MyLibTargets.cmake
└── include/
    └── mylib/
        ├── core.h
        └── utils.h

5. 其他项目集成示例

在目标项目的CMakeLists.txt中:

# 找到安装的库
find_package(MyLib REQUIRED)

# 链接共享库或静态库
add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE MyLib::mylib_shared)
# 或静态库:target_link_libraries(my_app PRIVATE MyLib::mylib_static)

内容的提问来源于stack exchange,提问作者Fabian Tobisch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:55:09