如何在MSVC中静态链接库?

4

我正在使用Microsoft Visual C++ 10编译我的程序,它使用PDCurses库。我已经将其配置为链接pdcurses.lib,但是当我尝试运行应用程序时,系统抱怨找不到“pdcurses.dll”。这不应该发生。我曾经使用MinGW(GCC)编译程序,当我尝试运行应用程序时,它不会要求我安装任何DLL文件。我该怎么做才能让MSVC静态链接PDCurses?


8
听起来这个pdcurses.lib并不是一个独立的静态库,而是DLL的导入库。你需要确保有一个独立的静态库,它不需要DLL。 - James McNellis
2个回答

8
在MSVC中,.lib文件有两种形式:
  1. 静态库
  2. 导入库
前者可用于使应用程序意识到从DLL中导出的入口点,然后将其写入PE文件的导入目录(或另一个类似位置的延迟加载导入)。
然而,后者将为每个引用的函数实际链接它所包含的代码到您的最终二进制文件中。这是您想要的,但如果您要链接的库的发布版本不提供它,则可能需要自己从源代码构建该静态库。
但是,还有另一种可能性:您可能只是传递了错误的目录以便链接器找到.lib文件。在这种情况下,您将链接导入库而不是静态库。确保检查您的生成日志以获取使用的路径。然而,这仅适用于库的发行版包含两种类型的库的情况。

我在同一个目录下有pdcurses.lib和pdcurses.dll。我已将“附加库”路径设置为该目录,因此应该能找到.lib文件。在“输入”字段中,我添加了pdcurses.lib。我曾经使用GCC将pdcurses静态链接到其他应用程序中。对我来说,问题似乎出在某些MSVC配置上,但我无法确定具体是什么。 - Fernando Aires Castello
仅仅因为你有一个 lib. 并不能说明它是什么类型的 .lib。一个简单的经验法则是查看 DLL 是否比 .lib 更小或更大。如果 DLL 更大,则 .lib 很可能只是一个导入库。如果 DLL 更小,则 .lib 很可能是你正在寻找的静态库。将你的构建日志细节包含在问题中,我们可能能够提供进一步帮助。GCC 的比较在这里没有意义,因为它直接使用存档 (.a) 或 .so。在 MSVC 中,动态链接需要导入库 (.lib)。 - 0xC0000022L

-4

这个dll文件需要在路径中。


2
这与静态链接完全无关。 - Cody Gray
如果您想使用PDCurses,必须将dll放在路径中。之后,您可以链接到接口库,然后一切正常。 - EvilTeach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接