2011-11-07 33 views
5

math.hで定義されている定数がどのようにリンクされているかについて質問があります。"math.h"の_HUGEと__IMP__HUGE

ビジュアルスタジオ2010では、「HUGE_VAL」を使用するサードパーティライブラリを使用する「MD」の64ビットdll C++ライブラリを構築しています。ヘッダー "math.h"から、 "HUGE_VAL"は "_HUGE"と定義されているようです。私が構築しようとすると、リンクエラーが

エラーLNK2001結果:いくつかのグーグルを行った後、未解決の外部シンボル_HUGE

を、私は_HUGEがMSVCRT.LIBに定義されるべきだと思います。 MSVCRT.libはリンクされていますが、libcmt.libはリンクを張らなかったため、再定義エラーが発生します。

HUGE_VALを使用し、/ verboseをリンカオプションとして使用する単純なコンソールプログラムを作成すると、_ IMP _HUGEがリンクされていることがわかります。

私は本当に興味がありますか?_HUGEはどの段階に入りますか?IMP _HUGE?また、誰かに解決されていない_HUGEエラーを受けさせて、誰にどのように修正できるかについてのアイデアはありますか?

長い質問と考え方をお読みいただきありがとうございます。

+0

私はVisual Studio(LinuxではGCCのみを使用しています)については何も知らず、HUGE_VALは標準です。おそらく、より新しい規格に厳密に従うようにコンパイラに依頼する必要がありますか? –

+2

/MTでコンパイルされた.obj/.libファイルが混在しています。ミックスすることはできません。リンクされたすべてのコードで同じ設定を使用する必要があります。 –

答えて

2

この問題はVC11.0で発生しました。私が得る唯一のエラーは未解決のシンボル_HUGEエラーです。

ダイナミックマルチスレッドランタイムライブラリとリンクしていて、リンクステップに「libcmt.lib」を含めると、問題が解決される(回避される)ことが判明しました。

手がかりのためにSDKでヘッダーがどのように定義されているかを調べ始めました。私のコンパイルステップでは、_DLLというコンパイラのプレディレクトリが見つかりませんでした。

ダイナミックランタイムライブラリを使用してビルドする場合、_HUGE変数は__declspec(dllimport)である必要があります。 "math.h" - > "crtdefs.h"をプリディレクティブとして設定せずにインクルードすると、その変数はリンク時に__declspec(dllimport)になりません。

自分のカスタムmakefileでコンパイルしているので、私は_DLLプリディレクティブを追加することを怠っていました。コンパイルのステップに-D_DLLを追加すると、コンパイルの問題が解決され、他の変更は必要ありませんでした。

私はこのスレッドは古いと知っていますが、同様の問題で誰かを助けるかもしれないので、私はそこに投げ捨てると考えました。

関連する問題