【问题标题】:Dependency to __libm_sse2_sincos_ in release发布中对 __libm_sse2_sincos_ 的依赖
【发布时间】:2019-09-10 14:05:10
【问题描述】:

我正在使用 msvc 2017 编译一个静态库,该库依赖于 math.h

在调试模式下,我可以使用这个库来构建一个可执行文件。在发布模式下,对__libm_sse2_sincos_ 的依赖出现在连续使用cossin 的函数上。

这是函数

Complex<double> polar(const double magnitude, const double radian) {
    const double re = magnitude * cos(radian);
    const double im = magnitude * sin(radian);
    return Complex<double>(re, im);
}

代码用/arch:AVX2/fp:fast/MT编译。

这个符号从何而来?从 Google 的快速搜索来看,它似乎与英特尔有关,但我的机器上没有安装英特尔编译器或任何相关的东西。

有没有办法追踪这个符号的来源?或者是一种避免依赖它的方法?

谢谢。

【问题讨论】:

  • 无法重现。 OKVStudio Community 2017 (v15.9.15) 配合使用。我不得不稍微简化一下代码,因为编译器不知道Complex。你在使用一些 3rd-party libs 吗? [SO]: How to create a Minimal, Reproducible Example (reprex (mcve)).
  • __libm_sse2_sincos:计算同数的正余弦。建议您参考link。请向我们提供更多详细信息以重现该问题。
  • @CristiFati 我能够重现对_libm_sse2_sincos godbolt.org/z/Yqbe1P 的调用但正如我所说,当我使用此代码链接静态库时发生这种情况,我认为我无法在线重现.

标签: math visual-c++ visual-studio-2017 linker


【解决方案1】:

符号__libm_sse2_sincos_ 来自MSVC CRT。您的代码计算相同值的sincos,因此编译器将这两个调用优化为一个(sincos),SSE2 版本。在您与 CRT 链接后,由于 /MT,所有 CRT 函数(包括该函数)都将嵌入到您的可执行文件中。

如果您使用不同的参数调用 sincos,您将收到两个单独的调用 ___libm_sse2_sin___libm_sse2_cos (link to godbolt demo)。

如果与函数链接有问题,则可能是发布项目设置已损坏。

注意:以__ 开头的函数保留用于实现,不必记录在案。此外,MSVC CRT 不是开源的(它的一部分是开源的,但不是数学部分)。

【讨论】:

    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 2015-09-21
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多