C ++,Visual Studio 2012,LIB,DLL,包含,源和链接器

时间:2014-02-17 20:26:40

标签: c++ visual-studio-2012 dll

我试图了解这些是什么以及它们如何相互关联(最重要的是,如何安装它们)。

根据我的阅读, LIBs 是在项目编译过程中链接的库, DLL 是在项目运行期间链接的库。

因此,对于我使用 LIB ,我必须在我的计算机中的某个地方放置实际的.LIB文件,转到项目 - > 属性 - > VC ++目录并在库目录中添加文件路径,然后我必须转到链接器 - > 输入 - > 附加依赖项在那里添加.lib名称,最后我需要在我的代码中输入 #include ,对吗?

所以,有些问题:

  1. 当我完成并构建我的程序版本时,如果目标平台的PC也安装了.lib,那么.exe只能运行吗?如果是,我需要采取哪些步骤来确保.lib与.exe一起使用?

  2. 当我获得一个开源项目的源代码时,如果我将它们(使用添加现有项... )添加到我的项目中,我可以使用#include来使用它们吗?好像文件是我的,它与安装.lib相同?或者我是否需要安装.lib文件并仍然使用这些源文件?

  3. 我有一个使用OpenGL的项目,我链接到 glew32.lib ,但我没有在 VC ++目录中添加lib或任何新目录,所以我认为这意味着我必须在系统文件夹中安装.lib或者Visual Studio不会要求另一个目录的地方,在发布项目时我是否应该担心这个?

  4. 上述问题如何与 DLL 相关,是否有任何理由我为什么要在LIB上使用DLL?反之?

  5. 我开始使用越来越多的库,我注意到我只是拖动,复制并将它包含在任何地方,所以我可以使用它们,但从未真正理解它们如何“适合”项目。特别是那些提供如此多文件的开源库,我真的不知道如何处理它们......

1 个答案:

答案 0 :(得分:3)

  1. 您不需要将LIB文件与EXE文件一起在另一台计算机上运行,​​LIB文件是静态文件,DLL文件是动态的。因此,当您编译所有静态代码时,将包含在您的EXE文件中,但DLL文件将在运行时动态加载和使用,因此您只需要将您的DLL文件与EXE文件一起使用。这样,您的代码就可以在其他计算机上正常运行。

  2. 仅添加另一个项目是不够的,您需要编译它们并从中生成LIB文件。然后将生成的LIB文件添加到最终项目中,并在最终二进制文件中包含外部项目。如果要在解决方案中一起编译多个项目,则需要在VS中的解决方案属性中设置项目构建顺序。

  3. 不,没关系。您似乎已将LIB文件放在正确的文件夹中,并且您不需要将LIB文件与EXE文件一起在其他计算机上运行。

  4. DLL是动态库,因此您需要将它们与您的应用程序一起使用。安装人员通常会在同一文件夹中安装带有DLL文件的EXE文件,因此您的应用程序将正常运行,但根本不需要包含LIB文件。

  5. 您还可以包含以下LIB文件:

    #pragma comment(lib, "glew32.lib")
    

    因此,您不需要在项目设置中执行此操作,但假设您的LIB文件位于“库目录”路径中。

    使用DLL文件可以通过两种方式完成: 一个是将您的应用程序链接到DLL文件,并在EXE文件的导入表中包含DLL文件的函数条目: 喜欢使用

    #include <windows.h>
    

    然后

    GetWindowsDirectory(windir, MAX_PATH);
    

    因此,您的EXE文件Import Table中将包含GetWindowsDirectory API条目。

    你也可以动态地做到这一点:

    hinstDLL = LoadLibrary("kernel32.dll");
    if (hinstDLL != NULL)
    {
        func_GetWindir = (DLLPROC) GetProcAddress(hinstDLL, "GetWindowsDirectoryA");
    ...
    

    没有太大区别,唯一的区别是: 在第一种方法中,就像在EXE文件的导入表中一样,如果kernel32.dll中没有GetWindowsDirectory或没有kernel32.dll条目,那么您的EXE将无法运行,它将显示一个严重的错误,不会运行。但是以动态方式(第二种方式),您的应用程序将运行,但只要您的代码尝试使用GetWindowsDirectoryA API,它就会失败。您将0x00中有func_GetWindir。如果您尝试调用它,程序将崩溃。