今天遇到一个LNK2005的错误,导致编译时程序正常,而link时一直报abseil_dll.lib已经定义的错误,于是查找各种资料:
错误原因分析如下:
-
同时链接了静态库和动态库(DLL):例如,项目中既引用了 Abseil 的静态库(如
abseil.lib),又引用了其动态库的导入库(abseil_dll.lib),两者包含相同符号,导致冲突。 -
重复包含库文件:项目配置中多次添加了同一个 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项目的协同-优快云博客

被折叠的 条评论
为什么被折叠?



