【问题标题】:How does Visual studio know which library to link if both static and dynamic libraries exist?如果静态库和动态库都存在,Visual Studio 如何知道要链接哪个库?
【发布时间】:2022-01-18 19:12:04
【问题描述】:

与外部库链接时,如果静态库和动态库都存在于同一个文件夹中,Visual Studio 将链接哪个库?

以boost文件系统库为例,x64静态库文件为libboost_filesystem-vc142-mt-x64-1_77.lib,x64动态库文件为boost_filesystem-vc142 -mt-x64-1_77.dllboost_filesystem-vc142-mt-x64-1_77.lib。所有这些文件都位于同一个文件夹中。链接时,Visual Studio 链接器如何知道使用哪一个?是否由标志运行时库(/MT 和 /MD)决定?

【问题讨论】:

  • 它链接到您告诉它链接到的库,如果您使用的是 boost 自动链接,那么它将链接到 boost 告诉它链接到的任何库
  • 应注意链接使用.lib 文件,而不是.dll ... dll 在运行时进入。
  • @AlanBirtles 对于没有 boost 库,Visual Studio 如何知道要使用哪一个?例如,我使用了一个名为 WebView2 的库。静态库文件名为:WebView2LoaderStatic.lib,动态库文件为:WebView2Loader.dll 和 WebView2Loader.dll.lib。它们都在同一个文件夹中。在这种情况下,链接器如何知道在链接时使用哪个库?
  • 它会使用你告诉它的任何一个,库有不同的名称
  • 您不知道自己需要的更准确的术语是boost_filesystem-vc142-mt-x64-1_77.lib 是一个导入库,它是一种特殊类型的静态库。它与动态库相关联,但不是动态库。

标签: c++ visual-studio compilation linker


【解决方案1】:

TLDR:是的,如果是boost,则选择基于项目选项(/MT 或 /ST)中选择的运行时。

长版:=)

Boost 库具有自动链接 功能。这种机制在头文件config/auto_link.hpp 中定义。 boost 正在尝试根据选定的构建架构、工具集、线程选项等来确定完整的库名称。有像BOOST_DYN_LINKBOOST_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) 来完成。否则会导致链接器错误

【讨论】:

  • 对于无 boost 库,Visual Studio 如何知道使用哪一个?例如,我使用了一个名为 WebView2 的库。静态库文件名为:WebView2LoaderStatic.lib,动态库文件为:WebView2Loader.dll 和 WebView2Loader.dll.lib。它们都在同一个文件夹中。链接器如何知道要链接哪个库?是否所有库都具有类似 boost 之类的自动链接功能?
  • 没有。大多数库要求您指定要链接的确切库名称。它可以在项目选项窗口(链接器/输入)中完成,也可以使用指令#pragma comment (lib)
  • @OptimusPrime:如果你把WebView2LoaderStatic.lib放在项目“链接器输入”选项中,你会得到静态链接,如果你把WebView2Loader.lib放进去,你会得到DLL导入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
相关资源
最近更新 更多