2011-03-01 180 views
23

我使用的libcurl和我得到的VC++ 10如何擺脫VC++中鏈接器中的__imp__前綴?

1>main.obj : error LNK2019: unresolved external symbol __imp__curl_easy_strerror referenced in function "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl curl_httpget(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" ([email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@Z) 

下面這種鏈接錯誤的我怎樣才能在函數名前擺脫小鬼前綴?我正在鏈接到正確的lib,正確的路徑等。

+0

相關(或者甚至重複)http://stackoverflow.com/questions/3704374/linking-error-lnk2019-in-msvc-unresolved-symbols-with-imp-prefix-but-should – Suma 2011-03-01 19:44:02

回答

40

無論何時鏈接到DLL,都會出現__imp__前綴。鏈接到靜態鏈接庫時不顯示。生成的代碼很可能是與DLL導入庫鏈接的,但您已將其與靜態庫鏈接起來。

當您用__declspec(dllimport)標記導入的函數時,添加前綴 - 確保您的導入在未鏈接DLL時不使用此功能。

+0

是的,我把它連接起來與一個靜態庫,但我怎麼鏈接到一個DLL導入庫(和這個選項鍊接到一個.dll集?)。 – BeeBand 2011-03-01 19:36:30

+2

Dll伴隨着.lib。通過鏈接到與.lib相關的鏈接來鏈接到dll。如果.lib是一個靜態庫或一個dll「蹦牀」,就不可能知道名稱.Lib是一個靜態庫或dll「蹦牀」,要知道這一點你需要檢查.lib裏面,但是.lib需要匹配你的導入。 – Suma 2011-03-01 19:49:00

+0

謝謝@Suma!在我的情況下,有一個ifdef導致了__declspec(dllimport),即使它是一個dll的依賴項。依賴關係是作爲靜態庫構建的,但不影響ifdef。 – Pascal 2017-02-04 20:11:33

3

您正在使用的規定與說明符評估,以__declspec(dllimport)

您需要可以重新定義正在評估這一(將其設置爲無)的聲明,或使用不同的頭文件中的函數原型的頭文件共。

13

你必須在你的項目的性質MSVC

+0

在我的情況下,我需要#include 2017-04-11 22:10:06

5

CURL_STATICLIB添加到預處理定義如果使用嚮導生成的項目 - 在project properties -> C/C++ -> Code Generation部分勾選「運行系統設置」值。

默認情況下,它通常具有「多線程DLL」值。您需要Multithreaded/MT和Multithreaded Debug/MTd值。

+0

當Visual Studio 2015中出現錯誤'LINK2019''無法解析的外部符號__imp_malloc'時,它會生效。它將在不包含'#include '或#包括'和崩潰,但是當我添加那些我得到了未解決的外部符號問題。 – douggard 2017-02-14 17:11:02