【问题标题】:Visual C++: What is a dynamically linked .lib file?Visual C++:什么是动态链接的 .lib 文件?
【发布时间】:2010-02-12 11:40:55
【问题描述】:

我注意到关于我使用的库的以下内容:

  • 库被编译成 .lib 文件。
  • 我的代码需要编译为多线程(调试)DLL才能链接到这个库。

我打开库的.sln(解决方案)文件(它是开源的)并在其项目属性中看到以下内容:

  1. 运行时库选项设置为多线程(调试)DLL
  2. 配置类型设置为静态库(.lib)

我的困惑是:

  1. 上面的库选项没有冲突吗? (静态库说一个选项,DLL 说另一个)
  2. 动态链接.lib是什么样的动物?它与 DLL 有何不同?

请注意,我知道 Linux 世界中静态库和动态库之间的区别。

【问题讨论】:

    标签: windows visual-c++ libraries


    【解决方案1】:

    “运行时库”选项与您的库无关。它告诉编译器您将在运行时从MSVCRTxx.DLL 导入您的函数。

    “配置类型”选项确实引用了您的库,因此独立于“运行时库”选项。

    【讨论】:

      【解决方案2】:

      Windows DLL 可以使用 LoadLibrary(或 LoadLibraryEx)API 动态加载,但您必须使用 GetProcAddress 或 GetProcAddressEx 查找每个导出的函数并将其绑定到函数指针。你最好把函数签名弄对,否则会像往常一样发生坏事。

      LIB 文件允许 Windows 在您的 EXE 启动时为您完成所有这些工作(包括查找要使用的 DLL,并递归加载依赖的 DLL),在运行时静态链接动态库,同时避免使您的 EXE 文件膨胀可执行代码,并允许多个进程共享内存中的同一个 DLL 映像。

      【讨论】:

        【解决方案3】:

        我不知道配置不匹配,但是使用 .DLL 库创建的 .LIB 文件是一个“导出库”——它不包含任何代码,只包含可调用函数和对象的名称在 DLL 中。链接器使用它来满足链接时的引用,最终通过运行时动态加载来解决。

        【讨论】:

        • 我无法在任何地方看到该库的任何 DLL 文件。然而,我的代码可以链接到 .lib 并执行!我错过了什么吗?
        • @Ashwin 听起来你有一个静态库。最好的办法是使用 Dependency Walker (dependencywalker.com 提供的免费工具)检查您的可执行文件,并查看它实际依赖的内容。
        • Neil Butterworth:如果你好奇的话,这个库就是 wxWidgets。用 Dependency Walker 检查了我的 .exe,我找不到任何 wx*.dll。我的 .exe 构建为多线程 DLL 并链接到 wx*.lib。这怎么可能? :-)
        • @Ashwin 我对 wxWidgets 一无所知,所以恐怕我帮不上忙。
        猜你喜欢
        • 2011-03-16
        • 1970-01-01
        • 2015-07-16
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-03
        相关资源
        最近更新 更多