使用cmake生成基于静态库的动态链接库

本文介绍如何在软件开发中使用ld工具将多个静态库合并为一个动态库,并详细解释了如何通过配置--whole-archive选项来确保所有函数都被包含。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在软件开发过程中,有时候需要基于静态库生成动态库文件。

ld执行时,默认会把静态库中不使用的函数过滤掉,导致生成的动态库文件不能包含所有的函数。所以需要配置ld的选项--whole-archive。

libsdk_api.a

SET(SRC_SDK_API sdk_api.c)
add_library(sdk_api STATIC ${SRC_SDK_API})

libsdk_dev.a

SET(SRC_SDK_DEV sdk_dev.c)
add_library(sdk_dev STATIC ${SRC_SDK_DEV})

libsdk_sys.a

SET(SRC_SDK_SYS sdk_memory.c)
add_library(sdk_sys STATIC ${SRC_SDK_SYS})

libsdk.so

add_subdirectory(api)
add_subdirectory(dev)
add_subdirectory(sys)
SET(SRC_SDK sdk_main.c)#生成动态库需要至少包含一个源文件
add_library(sdk SHARED ${SRC_SDK})


target_link_libraries(sdk 
 "-Wl,--whole-archive" #之后的库使用--whole-archive选项
 sdk_api
 sdk_dev 
sdk_sys 
"-Wl,--no-whole-archive")  #之后的库不使用--whole-archive选项


### 使用CMake生成动态库静态库 在C++开发过程中,通过CMake可以方便地管理项目并生成不同类型的库文件。为了创建动态库(共享库)和静态库,可以在`CMakeLists.txt`中定义相应的设置。 #### 创建静态库 静态库是在编译阶段链接到目标程序中的二进制文件集合。要创建一个名为`my_static_lib`的静态库: ```cmake add_library(my_static_lib STATIC src/static.cpp) ``` 这条命令告诉CMake将指定源码文件打包成静态库[^1]。 对于更复杂的场景,比如处理头文件复制以及解决多重包涵依赖关系时,则可参照如下配置方式来增强构建脚本的功能性[^3]: ```cmake set(header_files "path/to/header.h") file(COPY ${header_files} DESTINATION ${PROJECT_BINARY_DIR}/out/include) target_include_directories(my_static_lib PUBLIC ${PROJECT_SOURCE_DIR}/include) ``` 这里不仅指定了静态库本身的信息,还设置了公共包含路径以便其他模块能够访问该库提供的接口。 #### 创建动态库 相比之下,动态库会在运行时加载,并允许多个应用程序共享同一份副本。以下是创建名为`my_shared_lib`的动态库的方法: ```cmake add_library(my_shared_lib SHARED src/shared.cpp) ``` 此指令会指示CMake按照平台约定的方式去生产共享对象(.so) 或者DLL (.dll),具体取决于操作系统环境。 当涉及到多层依赖项之间的相互作用时——特别是针对那些既含有内部又存在外部依赖性的大型工程来说,在链接选项上做适当调整就显得尤为重要了: ```cmake set(LIBS "-L/path/to/libraries -llibrary_name") target_link_libraries(my_shared_lib PRIVATE -Wl,--start-group ${LIBS} -Wl,--end-group) ``` 上述代码片段展示了如何利用特定于链接器的关键字参数(`-Wl`) 来确保所有必要的符号都能被正确解析出来。 综上所述,无论是静态还是动态库的制作过程都离不开合理规划好各个组成部分间的关联逻辑;而借助像CMake这样的工具则可以让整个流程变得更加高效便捷。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值