【问题标题】:_HUGE and __IMP__HUGE in "math.h"“math.h”中的 _HUGE 和 __IMP__HUGE
【发布时间】:2011-11-07 21:06:23
【问题描述】:

我有一个关于 math.h 中定义的常量如何链接的问题。

在 Visual Studio 2010 中,我正在构建一个带有“MD”的 64 位 dll c++ 库,该库使用使用“HUGE_VAL”的第三方库。从标题“math.h”看来,“HUGE_VAL”被定义为“_HUGE”。当我尝试构建时,会导致链接错误

错误 LNK2001:无法解析的外部符号 _HUGE

在做了一些谷歌搜索之后,我认为 _HUGE 应该在 msvcrt.lib 中定义。链接了MSVCRT.lib,但是我没有链接libcmt.lib,因为会导致重新定义错误。

让我感到奇怪的是,当我创建一个使用 HUGE_VAL 并使用 /verbose 作为链接器选项的简单控制台程序时,它显示 _IMP_HUGE 正在链接。

我真正好奇的是_HUGE在什么阶段变成了_IMP_HUGE?另外,是否有其他人收到未解决的 _HUGE 错误,是否有人对如何修复它有任何想法?

感谢您阅读冗长的问题和任何想法。

【问题讨论】:

  • 我对 Visual Studio 一无所知(我只在 Linux 上使用 GCC),但 HUGE_VAL 是标准的。也许您需要要求您的编译器严格遵循更新的标准?
  • 您正在混合使用 /MT 编译的 .obj/.lib 文件。不能混用,所有链接的代码都需要使用相同的设置。

标签: c++ visual-studio 64-bit constants static-linking


【解决方案1】:

我在使用 VC11.0 时遇到过这个问题。我得到的唯一错误是未解决的符号 _HUGE 错误。

我正在链接动态多线程运行时库,我发现如果我要在链接步骤中包含“libcmt.lib”,那么问题就会得到解决(或解决)。

我开始研究 SDK 中如何定义标头以获取线索,发现我在编译步骤中缺少编译器预目录:_DLL。

当您使用动态运行时库构建时,_HUGE 变量需要是 __declspec(dllimport) 以便可以找到它。当您包含“math.h”->“crtdefs.h”而不将 _DLL 设置为预指令时,该变量将不会被 __declspec(dllimport)'ed 并在链接时显示为缺失。

我遇到了这个问题,因为我正在使用自己的自定义 makefile 进行编译,而我忽略了添加 _DLL 预指令。在我的编译步骤中添加 -D_DLL 解决了编译问题,无需进行其他更改。

我知道这个帖子很旧,但我想我会把它扔掉,因为它可以帮助遇到类似问题的人。

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2011-10-16
    • 1970-01-01
    • 2010-11-04
    • 2012-02-18
    • 2012-01-09
    相关资源
    最近更新 更多