如何在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
相关产品推荐
相关产品推荐

