使用静态库时未解析的外部符号“_hypot”

时间:2011-07-24 19:56:56

标签: c++ visual-studio-2010 linker

我正在尝试重新编译链接Ruby库的旧游戏,但我不断收到此错误:

  

ruby​​18-mt-static-release.lib(math.obj):错误LNK2001:未解决   外部符号_hypot

是否有任何解决方法,不需要我找到此库的源代码并重建它?

我正在使用Visual Studio 2010和最新的DirectX SDK。

4 个答案:

答案 0 :(得分:5)

我有类似的问题。显然,hypot曾经是一个可链接的函数,但现在(我有VS 2010)一个调用_hypot的内联函数。在math.h中,这是完成此操作的唯一函数。我没有我正在使用的现有库的源代码,并且它有链接到它的连字符,所以它不能使用内联版本。如果我自己定义hypot,链接器说它已经定义了。以下是解决此问题的方法:

  • 编辑math.h并注释或ifdef out of inline version of hypot。
  • 将hypot实现为extern“C”double hypot(double x,double y){return _hypot(x,y);}
  • 重新链接

丑陋,但它解决了这个问题。

答案 1 :(得分:2)

您正在使用该库的MT-STATIC版本。您需要确保您的项目(代码生成 - >运行时库)也设置为多线程,而不是多线程DLL。相反,您可以找到该库的MT-DLL版本。无论哪种方式,运行时库(MT或MTD)必须在您的程序和您要链接的所有库中保持一致。

http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx

答案 2 :(得分:2)

这是一个老问题,但我有一个新的解决方法,不需要修改 math.h

当我尝试在Visual Studio 2012(VS2012)中将“ msvcrt-ruby18-static.lib ”静态链接到我自己的dll时,我遇到了类似的问题。我收到了这个错误:

'unresolved external symbol __imp__hypot referenced in function _math_hypot'

感谢Matt的回答,我们知道它是由' math.h '的变化引起的。

此功能:

double hypot(double _X, double _Y)

在vs2010之前,它是一个由关键字声明的dll导出函数,如下所示:

extern "C" __declspec(dllexport) double __cdecl hypot(...)

自vs2010以来,它变成了一个内联函数:

static __inline double __CRTDECL hypot(...)

幸运的是,在VS2012中,内联函数由宏 RC_INVOKED 包裹。您可以尝试使用此公共域名植入来链接:

#define RC_INVOKED
#include <ruby.h>

extern "C" __declspec(dllexport)
double hypot(double x, double y)
{
    if (x < 0) x = -x;
    if (y < 0) y = -y;
    if (x < y) {
        double tmp = x;
        x = y; y = tmp;
    }
    if (y == 0.0) return x;
    y /= x;
    return x * sqrt(1.0+y*y);
}

[注意]我的项目是一个DLL,我直接使用dllexport关键字。似乎无法直接定义' __ imp __ '前缀。我试图定义一个名为 __ imp __ hypot(...)的函数,但我失败了。

答案 3 :(得分:0)

自己实施hypot()。这很简单:

double hypot(double x, double y) {
    double ax = fabs(x), ay = fabs(y);
    double xy = x/y, yx = y/x;
    return ax > ay
        ? ax * sqrt(1.0 + yx*yx)
        : ay * sqrt(1.0 + xy*xy);
}