c - 链接 GCC 构建的静态库时,MSVC 项目缺少 "__popcountdi2"

标签 c gcc visual-c++ mingw static-libraries

我有一个 Windows 可执行项目,它链接到使用 GCC 6 (MinGW) 构建的静态库 (.lib)。编译时出现如下错误:

LNK2019 unresolved external symbol __popcountdi2 referenced in function ...

由于使用驻留在 libgcc 中的 GCC 内置函数 __builtin_popcount(),符号被链接进来。然而,尽管将 -static-libgcc 添加为 gcc 的参数,问题仍然存在。

有没有办法让我的库 (.lib) 包含 libgcc 的一部分,而不是要求 libgcc 存在于系统上以便可执行文件链接?有什么办法可以解决必须使用 libgcc 运送库的问题吗?

__builtin_popcount() 不是我目前使用的唯一内置函数。该库使用了 __builtin_bswap32(),它似乎没有遇到这个问题。

我正在使用 GCC 6.1.0。更新至6.2.0;同样的问题。

最佳答案

问题是在 Windows 上,当传入 -march=native 时,MinGW (GCC) 没有正确检测当前的 CPU 架构。它退回到不支持 POPCNT 的架构作为 native 指令(可能是 i686)。作为测试,-mpopcnt 被添加到构建中并且一切正常。

修复方法是使用 -march= 手动指定架构。

此外:由于未正确轮询 native 架构,这是 MingGW 的错误吗?

关于c - 链接 GCC 构建的静态库时,MSVC 项目缺少 "__popcountdi2",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350556/

相关文章:

c - 如何快速动态地加载经常重新生成的C代码?

c - 结构中的字节顺序

代码漏洞

c++ - dllexport 一个全内联类?

c++ - 在 visual studio 中使用 libuv 编译简单的 c++ 项目

c - 同步访问双向链接列表

c++ - 为什么 gcc 生成一个 memmove 而不是 memcpy 来复制 std::vector<>?

c - 如何创建一个库,其中链接器仅链接我的程序使用的函数?

c++ - std::is_arithmetic 为泛型 lambda 中的 int 类型返回 false:未定义的行为?

C++ 调试器在控制台中跳过简单的代码行