天天看點

vc中運作庫的選擇

這兩天編譯工程的時候引入了mysql++的動态庫,但是在編譯的時候編譯器給出了很多error資訊:

錯誤    19    error LNK2019: 無法解析的外部符号 "__declspec(dllimport) public: void __thiscall std::basic_ios<char,struct std::char_traits<char> >::setstate(int,bool)" (__imp_?setstate@[email protected][email protected]@std@@@std@@[email protected]),該符号在函數 [email protected]@std@@@std@@[email protected][email protected]@std@@@[email protected]@[email protected]$0 中被引用    D:\server\Target\monquery\FTDDataWrapper.obj    monquery

錯誤    20    error LNK2001: 無法解析的外部符号 "__declspec(dllimport) public: void __thiscall std::basic_ios<char,struct std::char_traits<char> >::setstate(int,bool)" (__imp_?setstate@[email protected][email protected]@std@@@std@@QAEXH_N@

google一番才發現我對工程運作庫的選擇錯了,本應該選擇MDd,但是選擇了MTd。  下面是msdn給的解釋:

/MD

使此應用程式使用特定于多線程和 DLL 的運作庫版本。 定義 _MT 和 _DLL,并使編譯器将庫名 MSVCRT.lib 放入 .obj 檔案中。

用此選項編譯的應用程式靜态連結到 MSVCRT.lib。 此庫提供使連結器能夠解析外部引用的代碼的層。 實際工作代碼包含在 MSVCRversionnumber.DLL 中,後者必須在運作時對與 MSVCRT.lib 連結的應用程式可用。

/MDd 定義 _DEBUG、_MT 和 _DLL,并使此應用程式使用特定于多線程和 DLL 的調試版本的運作庫。 它還會讓編譯器将庫名稱 MSVCRTD.lib 放入 .obj 檔案中。
/MT 使此應用程式使用運作庫的多線程的靜态版本。 定義 _MT,并使編譯器将庫名 LIBCMT.lib 放入 .obj 檔案中,以便連結器使用 LIBCMT.lib 解析外部符号。
/MTd 定義 _DEBUG 和 _MT。 此選項還會讓編譯器将庫名稱 LIBCMTD.lib 放置到 .obj 檔案中,以便連結器将使用 LIBCMTD.lib 來解析外部符号。
/LD

建立一個 DLL。

将 /DLL 選項傳遞到連結器。 連結器查找 DllMain 函數,但并不需要該函數。 如果沒有編寫 DllMain 函數,則連結器将插入傳回 TRUE 的 DllMain 函數。

連結 DLL 啟動代碼。

如果未在指令行上指定導出 (.exp) 檔案,則建立導入庫 (.lib)。 将導入庫連結到調用 DLL 的應用程式。

将 /Fe(命名 EXE 檔案) 解釋為命名 DLL 而不是 .exe 檔案。 預設情況下,程式名會變成 basename.dll 而不是 basename.exe。

除非顯式指定 /MD,否則将暗指 /MT。

/LDd 建立調試 DLL。 定義 _MT 和 _DEBUG。
c++

繼續閱讀