【发布时间】:2021-08-29 09:19:48
【问题描述】:
我正在尝试链接到使用 Media Autobuild Suite 编译的 OpenAL soft 库,我从 Visual Studio 收到以下错误:
libopenal.a(source.cpp.o) : fatal error LNK1143: invalid or corrupt file: no symbol for COMDAT section 0xA
我的应用程序使用 C++ 并直接在 Visual Studio 2019 中编译(但是,使用 VS2017 工具集)。 OpenAL soft 使用 C++ 编写,但暴露了 C 接口,MAB Suite 使用 MinGW/gcc 编译并生成 libopenal.a 静态库文件。
我从诸如From MinGW static library (.a) to Visual Studio static library (.lib) 和How to use libraries compiled with MingW in MSVC? 等多个其他问题中了解到,由于名称修改,使用不同编译器编译的目标文件通常不与 C++ 兼容,但通常 与 C 链接兼容。因为 C 不使用名称修饰,并且因为 ABI(通常)依赖于操作系统,所以在同一平台上编译的具有 C 接口的库通常是兼容的。
尽管如此,我一直遇到链接器错误,即上面的LNK1143。我已经确认包含的标头使用extern "C" { 来提示C 链接,并且两个版本的目标平台(x64)是相同的。我还按照this answer 的建议链接到libgcc.a,并且没有收到任何链接器错误。
这是否意味着 C 接口通常跨编译器兼容的说法是不正确的? 或者这是它不起作用的特殊情况?如果是后者,什么可能导致链接失败?如果我重新编译为共享库 (dlls) 而不是静态库(即使我仍然使用 MinGW 的 .a 文件而不是 .lib),我的运气会更好吗?
我无法为我的主应用程序从 MSVC 更改编译器。我打算在未来使用更多来自 MAB 套件的库,所以如果可能的话,我更愿意使用 MinGW 来处理这些依赖项,因为我不想手动重新编译所有 70 多个库。
感谢任何帮助。提前致谢。
【问题讨论】:
-
我认为你运气不好,请参阅:social.msdn.microsoft.com/Forums/vstudio/en-US/… 和 docs.microsoft.com/en-gb/windows/win32/debug/…。那个帖子很老了,但看起来什么都没有改变。也许是 some mingw 目标文件将链接但其他的情况。无论如何,这似乎是证据。
-
你能用 MSVC 构建库吗?它似乎是一个 cmake 项目,并说它是作为一个仅限 Windows 的库开始的。
-
stackoverflow.com/questions/2529770/… 似乎涵盖了所提出的问题
-
@M.M 我已经在我的问题中提到了这个问题,我的经验与这些答案相冲突,这就是我感到困惑的原因。如果可能的话,我想继续使用 MinGW 作为库,因为 suite I'm using to compile it 还构建了我打算在未来使用的 70 多个其他依赖项,我不想手动重建它们。现在看起来这可能是不可能的
-
是的,使用共享库它应该可以工作(我很确定这就是兼容的 C 接口的含义)。
标签: c++ c visual-c++ linker mingw