Visual Studio C++多库链接:调用封装库为何需重复引入底层依赖
问题原因排查
编译期要求引入AWS头文件的原因
- 你封装库的公开头文件(即外部项目引入的awswrp头文件)直接引用了AWS SDK的头文件,或是将AWS的类型作为公开接口的参数、返回值、类成员使用。编译器处理外部项目代码时需要解析这些类型的定义,自然会要求你配置AWS头文件的搜索路径。
- 解决方法:使用*Pimpl惯用法(指针实现)*把AWS相关的类型、依赖全部藏到封装库的内部实现中,公开头只暴露你自定义的纯接口,不包含任何AWS相关的引用,即可避免编译期依赖AWS头。
链接期要求引入AWS库的原因
- 你的原有认知存在偏差:静态库本身只是编译目标文件的归档包,不会自动把它依赖的其他静态库内容打包进去,只有*动态库(DLL/so)*会把自身依赖的其他库的链接关系记录在自身结构中。链接器处理静态库时,只会抽取出被调用到的函数/符号,如果你封装库的实现里调用了AWS的函数,这些符号对链接器来说还是未解析状态,自然要求你额外链接AWS的对应lib。
- 如果你希望外部项目只需要链接
awswrp.lib、不需要额外链接AWS的库,需要在打包静态库时,把AWS所有依赖静态库的编译目标文件全部合并到你的awswrp.lib里,不同工具链操作方式不同:- MSVC工具链:使用命令
LIB.EXE /OUT:awswrp.lib awswrp_obj.obj aws-cpp-sdk-core.lib aws-cpp-sdk-xxx.lib [其他AWS依赖库]合并 - GCC/Clang工具链:使用
ar命令把多个静态库的内容解压后重新打包成一个合并的静态库
- MSVC工具链:使用命令
内容的提问来源于stack exchange,提问作者ematrix
相关产品推荐
相关产品推荐

