我正在尝试重新编译链接Ruby库的旧游戏,但是一直出现以下错误:
ruby18-mt-static-release.lib(math.obj): error LNK2001: unresolved external symbol _hypot
有没有不需要我找到该库的源代码并重新构建的解决方法?
我正在使用Visual Studio 2010和最新的DirectX SDK。
我正在尝试重新编译链接Ruby库的旧游戏,但是一直出现以下错误:
ruby18-mt-static-release.lib(math.obj): error LNK2001: unresolved external symbol _hypot
有没有不需要我找到该库的源代码并重新构建的解决方法?
我正在使用Visual Studio 2010和最新的DirectX SDK。
http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx
这是一个旧问题,但我有一个新的解决方法,不需要修改 math.h。
当我尝试在Visual Studio 2012 (VS2012)中将 'msvcrt-ruby18-static.lib' 静态链接到我的DLL时,遇到了类似的问题。我收到了以下错误:
'unresolved external symbol __imp__hypot referenced in function _math_hypot'
double hypot(double _X, double _Y)
在 VS2010 之前,它是通过以下关键字声明的 DLL 导出函数:
extern "C" __declspec(dllexport) double __cdecl hypot(...)
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(...)的函数,但失败了。
自己实现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);
}