2011-11-07 40 views
5

我有一個關於math.h中定義的常量如何鏈接的問題。_HUGE和__IMP__HUGE在「math.h」中

在visual studio 2010中,我用「MD」構建了一個64位的dll C++庫,它使用了使用「HUGE_VAL」的第三方庫。從頭文件「math.h」看來,「HUGE_VAL」被定義爲「_HUGE」。當我嘗試建立,一個鏈接錯誤導致

錯誤LNK2001:解析外部符號_HUGE

做一些google搜索後,我覺得應該_HUGE在MSVCRT.LIB定義。 MSVCRT.lib已鏈接,但我沒有鏈接libcmt.lib,因爲它會導致重新定義錯誤。

什麼令我奇怪的是,當我創建使用HUGE_VAL並使用/冗長作爲一個連接器選項一個簡單的控制檯程序,它顯示_ 被鏈接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」而不將_DLL設置爲預指令,則該變量將不會是__declspec(dllimport)'ed,並且在鏈接時會顯示爲缺失。

我得到這個問題,因爲我正在編譯我自己的自定義makefile,而我忽略了添加_DLL預指令。將-D_DLL添加到我的編譯步驟中解決了編譯問題,而無需進行其他更改。

我知道這個帖子已經過時了,但是我覺得我會把它扔出去,因爲它可能會幫助有類似問題的人。