鏈接外部庫時,如果靜態庫和動態庫都在同一個檔案夾中,Visual Studio 會鏈接哪個庫?
例如,對于 boost 檔案系統庫,x64 靜態庫檔案為libboost_filesystem-vc142-mt-x64-1_77.lib,x64 動態庫檔案為boost_filesystem-vc142-mt-x64-1_77.dll和boost_filesystem-vc142- mt-x64-1_77.lib。所有這些檔案都位于同一檔案夾中。鏈接時,Visual Studio 聯結器如何知道使用哪一個?它是由標志運行時庫(/MT 和 /MD)決定的嗎?
uj5u.com熱心網友回復:
TLDR:是的,如果boost選擇基于專案選項(/MT 或 /ST)中選定的運行時。
長版:=)
Boost庫具有自動鏈接功能。這個機制在頭檔案中定義config/auto_link.hpp。boost 試圖根據選定的構建架構、工具集、執行緒選項等確定完整的庫名稱。有像這樣的定義BOOST_DYN_LINK,BOOST_AUTO_LINK_NOMANGLE它允許你控制這個程序。還程序可以通過例如庫部分具體定義進行控制:BOOST_ASIO_DYN_LINK對boost::asio
選擇靜態/運行時庫的相關部分如下所示:
#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
# define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
# error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
# define BOOST_LIB_PREFIX "lib"
#endif
基本上它取決于_DLL或_RTLDLL前處理器選項。根據MSDN
_DLL 在設定了 /MD 或 /MDd(多執行緒 DLL)編譯器選項時定義為 1。否則,未定義。
對于其他庫,您必須指定要鏈接的確切庫名。這可以在專案選項視窗(MSVC 中的聯結器/輸入)中完成,也可以通過#pragma comment(lib libname)直接在源代碼中使用指令來完成。不這樣做將導致聯結器錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/383729.html
上一篇:VisualStudio2022有時會顯示“應用程式無法正確啟動”
下一篇:按特定int對串列進行排序
