Это старый вопрос, но у меня есть новый обходной путь, который не нужно изменять math.h .
Я столкнулся с аналогичной проблемой при попытке статической ссылки ' msvcrt-ruby18-static.lib 'в мою собственную DLL в Visual Studio 2012 (VS2012).Я получил эту ошибку:
'unresolved external symbol __imp__hypot referenced in function _math_hypot'
Благодаря ответу Мэтта мы знаем, что это вызвано изменением ' 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 (...) , и мне не удалось.