繁体   English   中英

使用 MSVC 的 Linker 中的“LNK2005 DLLMain 已定义...”冲突

[英]"LNK2005 DLLMain already defined ..." conflict in Linker using MSVC

我有一个 C++ 项目,到目前为止编译和链接都没有问题,但由于最近的计算机崩溃,我不得不重新安装所有东西,包括 Visual Studio 和我所有的 VCPKG 包。 (我使用的是 VS 2022 预览版,之前是这样。)

我的项目使用了许多静态链接的库,包括英特尔的 TBB 和 Armadillo(这取决于 OPENBLAS 等)。 但是,需要注意的是,即使项目使用 static 链接,OPENBLAS 和 TBB 仍然需要链接 DLL。

现在我正在用以前工作的相同项目属性编译同一个项目,并且不断收到 LNK2005 错误,指出:

DllMain 已经在 openblas.lib(memory.c.obj) 中定义...... tbb_debug.lib(tbb_main.obj)

如果我切换链接顺序,所有发生的都是错误更改为

DllMain 已在 tbb_debug.lib(tbb_main.obj).... openblas.lib(memory.c.obj) 中定义

[注意:在发布和调试配置中链接是同样的问题。]

现在我想不通的是为什么会发生这种情况。 当然,项目依赖多个进口 DLL 是正常的。 DLL 导出它们的 DllMain 入口点 function 是很正常的。

由于 PC 崩溃,我被迫将所有内容升级到绝对最新版本,我想知道这是否在某个地方引入了问题。

这是 MSVC 中的一个错误,它认为来自两个不同 DLL 的两个 DllMain 函数存在冲突?

如果这是一个真正的冲突,有人可以向我解释一下,使用第三方 DLL 构建大型项目的人不会经常发生这种情况吗?

我已经尝试了所有方法,包括全新安装 VCPKG,但没有任何帮助。

我发现完成链接的唯一选择是使用 /FORCE:MULTIPLE 选项,我真的不喜欢它,因为它可能会创建有缺陷的可执行文件。

这里的任何建议将不胜感激。

好的 - 我想出了一个不需要 /FORCE:MULTIPLE 的解决方案

似乎 OPENBLAS 和 TBB 两者或其中之一都无法静态构建,即使这两个包都可以使用三元组x64-windows-static良好编译。

我所做的是创建自己的名为x64-windows-mixed的三元组,以静态和动态链接库。 默认为 static,它仅对 TBB 和 OPENBLAS 使用动态。

这是我创建的新三元组的代码:

set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE static)
set(VCPKG_LIBRARY_LINKAGE static)

if (${PORT} MATCHES "tbb")
   set(VCPKG_LIBRARY_LINKAGE dynamic)
endif()

if (${PORT} MATCHES "openblas")
   set(VCPKG_LIBRARY_LINKAGE dynamic)
endif()

创建这个“混合”三元组后,您需要vcpkg install xxxx:x64-windows-mixed所有需要使用的库,并在项目属性页面的 VCPKG 部分定义新的三元组

这允许编译静态编译的项目,但也可以动态链接 OPENBLAS 和 TBB。

请参阅 VCPKG 文档https://vcpkg.readthedocs.io/en/latest/users/triplets/#per-port-customization

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM