gpt4 book ai didi

c++ - 如果两个静态库使用相同的另一个静态库,如何避免 "LNK2005 Already Defined error"?

转载 作者:行者123 更新时间:2023-12-03 07:03:49 24 4
gpt4 key购买 nike

情况:

  • 静态库 LIB1,从源代码编译并链接为 lib1.lib(使用/MD)。
    使用库 LIB2 并具有来自 lib2.lib
  • 的内部对象
  • 静态库 LIB2,也使用/MD 编译。
  • EXE(不直接)依赖于这两个库。

  • 在 MSVC 15.9.19 上链接此 EXE 的结果:很多 LNK2005 错误,例如
    lib2.lib: error LNK2005: "function <funcsig> already defined in lib1.lib"

    我也收到很多警告,比如
    lib1.lib: warning LNK4099: PDB 'lib2.pdb' was not found with 'lib1.lib' or at '<path>'; linking object as if no debug info

    问题:为什么链接器不合并重复的定义?如何诊断此问题的确切原因?

    谢谢!

    更新:
    这些错误与标准库无关。它们是关于 Google Protobuf 功能的。 LIB2 是 Google 的 libprotobuf.lib。 LIB1 也是 Google 的使用 Protobuf 的 OR-Tools 库。但是我们也使用 Protobuf,因此冲突!

    最佳答案

    这个link to MSDN几乎肯定会有所帮助。

    正如您所说,这些不是标准的 C/C++ 函数,您可以忽略有关混合调试和发布代码的部分。不幸的是,这仍然给您留下了很多可能的原因。这是一个很好的排除方法。

    This error can occur if you mix use of static and dynamic libraries when you use the /clr option.



    如果您在编译时查看命令行选项,可以打开 verbose mode或检查每个文件的属性。

    一旦排除了这一点,所有其他原因就是您实际上两次声明了相同的事物(函数/变量)。最有可能发生这种情况的方法是将某些内容(如函数)放入头文件中,该头文件包含在多个模块文件中。在没有看到代码的情况下进行诊断是很困难的。您必须选择其中一个错误,并选择名称中不是 mangled 的部分。 ,基本上是人类可读的位。然后,您需要检查它的声明位置,并查看是否在 header 中。如果不是,则必须包含源文件中的非 header 。找到包含文件的位置的快速(且肮脏)方法是添加 #pragma message到文件,然后一次重新编译一个文件,看看它何时打印。要了解为什么包含它,请使用 show includes .

    如果符号是从头文件中声明的,则必须通过将其设为 forward declare 来修复它。 .
    如果您不知道如何执行此操作,我建议您开始一个新问题,类似于“我如何转发声明这个?”。它应该很快就能让你得到答案。

    希望这可以帮助。

    关于c++ - 如果两个静态库使用相同的另一个静态库,如何避免 "LNK2005 Already Defined error"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59917196/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com