_HUGE и __IMP__HUGE в "math.h" - PullRequest
       22

_HUGE и __IMP__HUGE в "math.h"

5 голосов
/ 08 ноября 2011

У меня вопрос о том, как связаны константы, определенные в math.h.

В Visual Studio 2010 я создаю 64-битную библиотеку dll c ++ с MD, которая использует стороннюю библиотеку, использующую HUGE_VAL. Из заголовка "math.h" кажется, что "HUGE_VAL" определен как "_HUGE". Когда я пытаюсь собрать, возникает ошибка компоновки

ошибка LNK2001: неразрешенный внешний символ _HUGE

После некоторого поиска в Google, я думаю, _HUGE должен быть определен в msvcrt.lib. MSVCRT.lib связан, но я не связывал libcmt.lib, потому что это может привести к ошибкам переопределения.

Меня удивляет то, что когда я создаю простую консольную программу, которая использует HUGE_VAL и использует / verbose в качестве опции компоновщика, она показывает, что _ IMP _HUGE связаны.

Что меня действительно интересует, так это на каком этапе _HUGE превращается в _ IMP _HUGE? Кроме того, кто-нибудь еще получил неразрешенную ошибку _HUGE и есть у кого-нибудь какие-либо идеи относительно того, как это можно исправить?

Спасибо за чтение длинного вопроса и за любые идеи.

1 Ответ

2 голосов
/ 22 августа 2013

У меня возникла эта проблема с VC11.0. Единственная ошибка, которую я получаю - это неразрешенная ошибка символа _HUGE.

Я связываюсь с динамическими многопоточными библиотеками времени выполнения и обнаружил, что если бы я включил "libcmt.lib" в свой шаг ссылки, то проблема была бы решена (или обошлась).

Я начал изучать, как заголовки были определены в SDK для подсказок, и обнаружил, что мне не хватает предварительной директории компилятора в моих шагах компиляции: _DLL.

При сборке с динамическими библиотеками времени выполнения переменная _HUGE должна иметь значение __declspec (dllimport), чтобы ее можно было найти. Когда вы включаете "math.h" -> "crtdefs.h" без установки _DLL в качестве предварительной директивы, переменная не будет __declspec (dllimport) 'ed и будет отсутствовать во время ссылки.

Я получил эту проблему, потому что я компилирую с моими собственными make-файлами, и я забыл добавить пре-директиву _DLL. Добавление -D_DLL к моему шагу компиляции решило проблему компиляции без каких-либо других изменений.

Я знаю, что эта ветка старая, но решила, что я ее выброшу, поскольку она может помочь кому-то с подобной проблемой.

...