grpc++.lib(client_context.cc.obj) : error LNK2005:*already defined in abseil_dll.lib(abseil_dll.dll)

     今天遇到一个LNK2005的错误,导致编译时程序正常,而link时一直报abseil_dll.lib已经定义的错误,于是查找各种资料:

错误原因分析如下:

  1. 同时链接了静态库和动态库(DLL):例如,项目中既引用了 Abseil 的静态库(如abseil.lib),又引用了其动态库的导入库(abseil_dll.lib),两者包含相同符号,导致冲突。

  2. 重复包含库文件:项目配置中多次添加了同一个 Abseil 库(如abseil_dll.lib被重复列入链接器输入)。

解决方法:
1.检查并移除重复的库引用
  • 在 Visual Studio 中,打开项目属性 → 链接器 → 输入 → 附加依赖项,检查是否有重复的 Abseil 库(如abseil_dll.lib出现多次),或同时存在静态库和动态库的引用,保留一个即可。

我看了下使用vcpkg 默认安装是动态库,不会存在静态库的问题,所以原因1可以排除。

那就从第二个原因上分析,我在链接器->通用->附加库目录中指定了vcpkg_installed\x86-windows\x86-windows\lib,但没有在链接器->输入->附加依赖项中指定具体库的名称,默认链接时会全部引用库,我的lib中的库如下:

以上标红的grpc++.lib和abseil_dll.lib正是冲突的元凶,我看网上有文章说可以在链接器->输入->忽略指定的默认库,我试着忽略absel_dll.lib,重新build, 但没有成功。

那是不是链接时没有指定具体的库导致链接冲突呢?后来看到附加库没有指定具体的库,于是在链接器->输入->附加依赖项指定以下grpc库:

grpc.lib
gpr.lib
grpc++.lib
libprotobuf.lib
zlib.lib

删除release下的.obj等临时文件,rebuild all,项目成功生成。(哈哈,爽)

主要原因附加依赖项没有指定具体的库,默认安装的grpc library时会安装abseil_dll.lib被其它absl引用 ,而grpc也集成了absel_dll.lib库,导致重复引用冲突,在链接时只指定一个就解决问题了。

具体abseil与grpc的关系,请看文章Abseil生态整合:与其他Google项目的协同-优快云博客

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值