【问题标题】:Having trouble linking a static library C++无法链接静态库 C++
【发布时间】:2008-10-21 23:23:46
【问题描述】:

我已经知道如何设置 VC++ 将代码编译成 .lib 文件而不是 .exe,但我无法让 lib 与我的其他 .obj 文件链接在一起。

这是我设置库和应用程序文件夹的方式。 (我不确定这是否正确)

AppFolder
  App.sln
  App.ncb
  *.h
  *.cpp
  Debug
    *.obj
    App.exe

以及硬盘上的其他地方...

LibraryFolder
  lib
    Library.lib
  include
    LibrarySolutionFolder
      Library.sln
      Library.ncb
      *.h
      *.cpp
      Debug
        *.obj
        Library.lib

我一直在#include 我的应用程序的 cpp 文件中的库 *.h 文件,并且一切编译正常。只是当它链接时,我得到了所有 .lib 的列表 正在搜索的文件,并且 Library.lib 不在那里,即使我将它列在 VC++ 目录中。 我怎样才能得到这个链接? (我是否正确地构建了库文件夹?)

【问题讨论】:

    标签: c++ static linker


    【解决方案1】:

    关于项目属性:

    配置属性 -> 链接器 -> 输入 -> 附加依赖项

    把它加进去。

    或者,在库的 .h 文件中,添加:

    #pragma comment(lib, "Library")
    

    这会自动为您完成。

    【讨论】:

      【解决方案2】:

      VC++ 目录是链接期间要搜索的目录位置列表。它不是要链接的库列表。

      您需要将 lib 文件添加到 Project Linker 设置的 Additional Dependencies 字段。

      【讨论】:

        【解决方案3】:

        要链接到库,您可以:

        • 在 Project-> Properties...->Linker, Input->Additional Dependancies 中列出它 (VC++ 目录只允许您使用 .lib 名称而不是完整路径),
        • 将库项目添加到您的应用程序。解决方案(在解决方案上,右键单击 -> 添加 -> 现有项目...),然后使用项目 -> 项目依赖项...,然后检查您的库项目(确保在下拉列表中选择了应用程序项目)。如果您同时编辑这两个项目,这可能是最好的方法,因为如果库在构建您的应用程序之前发生更改,VC++ 将重新构建库。
        • 如果你确定你只会使用 VC++,

            #pragma comment(lib,"C:\\path\\to\\library.lib")`
          

          (感谢@Nils)

        注意:将您的库解决方案文件夹放在“包含”目录中似乎很奇怪:这实际上是用于 *.h(或其他 #included 文件)的。

        【讨论】:

          【解决方案4】:

          从命令行:

          cl /EHsc {objfiles}+ /link /LIBPATH:LibraryFolder Library.lib

          其中 {objfiles}+ 表示一个或多个对象或 cpp 文件。

          【讨论】:

            【解决方案5】:

            如果包含头文件,VC 不会简单地链接库。

            您必须告诉链接器使用该库。有充分的理由:您的库文件夹中已经有数千个库。如果每次链接程序时 MSVC 都必须搜索所有这些,则它必须遍历数百兆字节的数据。

            这需要相当长的时间,因此默认情况下不会这样做。

            对于 VC,您还可以提示源代码中的链接器。为此,您在源代码的某处添加以下行(lib 的标头可能是一个好地方)。

            #pragma comment(lib,"c:\\path_to_library\\libname.lib")
            

            这不是平台无关,而是使用 MSVC 将库自动链接到项目的最便捷方式。

            另一种方法是简单地将链接器添加到项目设置中。可以在项目的链接器设置中找到相关信息。不要忘记将 lib 添加到发布和调试配置中。

            【讨论】:

            • 使用带有绝对路径的#pragma comment(lib,...) 不仅仅是编译器特定的。它是“特定于您的机器的”(除非它指的是“替代”驱动器或网络驱动器映射)。链接器搜索路径选项 -L 更好(#include 和 -I 同上)。但是,嘿,它已通过“在我的机器上工作”认证。
            • 我认为这是很明显的例子,bk1e。你真的认为我的驱动器上有一个名为“path_to_library”的目录吗? 头撞桌子
            • 以驱动器号开头,后跟冒号和反斜杠的路径是绝对路径。如果您不是要建议使用绝对路径,请不要建议使用绝对路径。 #pragma comment(lib, "libname.lib"); 确实足够了(并且更接近您在大多数情况下会看到的内容)。
            猜你喜欢
            • 1970-01-01
            • 2020-07-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-25
            • 1970-01-01
            • 2012-04-17
            相关资源
            最近更新 更多