我正在尝试重新编译链接Ruby库的旧游戏,但我不断收到此错误:
ruby18-mt-static-release.lib(math.obj):错误LNK2001:未解决 外部符号_hypot
是否有任何解决方法,不需要我找到此库的源代码并重建它?
我正在使用Visual Studio 2010和最新的DirectX SDK。
答案 0 :(得分:5)
我有类似的问题。显然,hypot曾经是一个可链接的函数,但现在(我有VS 2010)一个调用_hypot的内联函数。在math.h中,这是完成此操作的唯一函数。我没有我正在使用的现有库的源代码,并且它有链接到它的连字符,所以它不能使用内联版本。如果我自己定义hypot,链接器说它已经定义了。以下是解决此问题的方法:
丑陋,但它解决了这个问题。
答案 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);
}