lib文件是否仅以静态方式链接,或者是否需要专门编译(VS2015)

时间:2017-01-04 19:16:17

标签: c++ winapi visual-studio-2015

我对静态和动态链接库以及.lib和.dll文件有些困惑。

我有一个包含两个库的项目,一个是我自己构建的,另一个来自开源库。

我自己构建的是同一解决方案中的一个单独项目(Visual Studio 2015,C ++),我不需要复制.lib文件或为可执行文件创建DLL来构建和运行

对于其他开源库,我需要将.lib文件和DLL复制到可执行文件夹中。但是,我认为可以静态链接.lib文件而不必复制DLL。

这是否意味着我需要以不同方式编译开源库?比如将 __ declspec(dllexport)更改为__declspec(dllimport)?或者在编译器选项中将 / mD更改为/ mT

我尝试了这两种方法,但它仍然说它不能在没有.dll的情况下开始

或者我可以通过更改可执行项目中的设置来静态链接此库吗?如果是这样,这些设置是什么?

编辑:我知道这是一个可以在谷歌上查找的标准问题,但我暂时无法找到确切的答案。主要是,我对需要更改的设置感到困惑,并且需要更改哪个项目。(库或可执行文件)。

我假设静态链接意味着库内置于可执行文件中,动态链接意味着库需要位于单独的文件中,如果这不正确,请告诉我。否则,我需要知道如何将库构建到可执行文件中。

我可以继续更改开源库中的构建选项,我已经尝试过了。

谢谢, -D

2 个答案:

答案 0 :(得分:0)

我必须更改"静态库"的设置。对于所有配置,不仅仅是Debug,尽管它是在Debug中构建的。不确定是什么导致了这一点。可能是因为库的调试和发布版本设置为相同的文件夹,它可能在构建时用发布版本覆盖调试版本

答案 1 :(得分:-1)

在Windows中,dll文件(动态链接库)需要与应用程序位于同一目录中,或者位于搜索路径中。 lib文件(静态库)需要在链接期间静态链接(构建应用程序的最后一步)。它在Windows中很常见,所以有一个库附带一个dll和lib文件。在这种情况下,lib文件是一个导入库,包含轻松链接到dll所需的信息。

将dll文件放在构建应用程序的位置,并与lib文件静态链接。转到'项目 - >属性 - >链接 - >输入 - >其他依赖关系'和'项目 - >属性 - >链接 - >一般 - >其他库目录'指定要链接的静态库。

编辑:我似乎误解了这个问题。问题是如何将动态库重新编译为静态库。您需要使用您正在使用的库的源代码以及Visual Studio Project文件。打开库并在`Project-> Properties-> General-> Configuration Type'将其从动态库更改为静态库。

请注意,动态库使用Linker属性组,而静态库使用Librarian属性组。在这些类型之间切换可能会导致项目丢弃必要的链接器标志选项。由于每个图书馆都不同,我无法预测你将要做些什么来解决这个问题。确保备份项目文件,以便查看原始选项和标记。