如果同时存在静态库和动态库,Visual studio 如何知道要 link 哪个库?
How does Visual studio know which library to link if both static and dynamic libraries exist?
当link使用外部库时,如果静态库和动态库都存在于同一个文件夹中,哪个库会Visual Studio link?
以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。所有这些文件都位于同一个文件夹中。当 linking 时,Visual Studio linker 如何知道使用哪一个?是由flag Runtime Library(/MT和/MD)决定的吗?
TLDR: 是的,在 boost
的情况下,选择基于项目选项(/MT 或 /ST)中选定的运行时间。
长版:=)
Boost
库具有 autolinking 功能。该机制在头文件 config/auto_link.hpp
中定义。 boost 试图根据选定的构建体系结构、工具集、线程选项等来确定完整的库名称。有像 BOOST_DYN_LINK
、BOOST_AUTO_LINK_NOMANGLE
这样的定义可以让你控制这个过程。也可以通过库部分特定定义来控制过程,例如:BOOST_ASIO_DYN_LINK
for the boost::asio
选择 static/runtime 库的相关部分如下所示:
#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 Defined as 1 when the /MD or /MDd (Multithreaded DLL) compiler option is set. Otherwise, undefined.
对于其他库,您必须针对 link 指定 确切的 库名称。这可以在项目选项 window(在 MSVC 的情况下为 Linker/Input)中完成,也可以通过直接在源代码中使用指令 #pragma comment(lib libname)
来完成。如果不这样做,将导致 link 错误
当link使用外部库时,如果静态库和动态库都存在于同一个文件夹中,哪个库会Visual Studio link?
以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。所有这些文件都位于同一个文件夹中。当 linking 时,Visual Studio linker 如何知道使用哪一个?是由flag Runtime Library(/MT和/MD)决定的吗?
TLDR: 是的,在 boost
的情况下,选择基于项目选项(/MT 或 /ST)中选定的运行时间。
长版:=)
Boost
库具有 autolinking 功能。该机制在头文件 config/auto_link.hpp
中定义。 boost 试图根据选定的构建体系结构、工具集、线程选项等来确定完整的库名称。有像 BOOST_DYN_LINK
、BOOST_AUTO_LINK_NOMANGLE
这样的定义可以让你控制这个过程。也可以通过库部分特定定义来控制过程,例如:BOOST_ASIO_DYN_LINK
for the boost::asio
选择 static/runtime 库的相关部分如下所示:
#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 Defined as 1 when the /MD or /MDd (Multithreaded DLL) compiler option is set. Otherwise, undefined.
对于其他库,您必须针对 link 指定 确切的 库名称。这可以在项目选项 window(在 MSVC 的情况下为 Linker/Input)中完成,也可以通过直接在源代码中使用指令 #pragma comment(lib libname)
来完成。如果不这样做,将导致 link 错误