【问题标题】:C++, Visual Studio 2012, LIBs, DLLs, Includes, Source and LinkerC++、Visual Studio 2012、LIB、DLL、包含、源代码和链接器
【发布时间】:2014-02-17 20:26:40
【问题描述】:

我试图了解所有这些到底是什么以及它们之间的关系(最重要的是,如何安装它们)。

据我了解,LIB 是在我的项目编译期间链接的库,DLLs 是在我的项目运行期间链接的库。

所以我要使用 LIB,我必须在我的计算机中的某个位置有实际的 .LIB 文件,转到 Project -> Properties -> VC++ Directories 并在 Library Directories 中添加文件路径,之后我必须转到 Linker -> Input -> Additional Dependencies 在那里添加.lib 名称,最后我需要在我的代码中输入#include ,对吗? p>

所以,一些问题:

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

  2. 当我获得一个开源项目的源代码时,如果我将它们(使用 Add Existing Item...)添加到我的项目中,我是否可以仅通过使用 #include 来使用它们好像这些文件是我的,它与安装 .lib 一样吗?还是我需要安装 .lib 文件并仍然使用这些源文件?

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

  4. 上述问题与 DLLs 有什么关系,我有什么理由应该使用 DLLs 而不是 LIB 或其他方式?

我开始使用越来越多的库,我注意到我只是在任何地方拖动、复制和包含它,以便我可以使用它们,但从未真正理解它们如何“适合”项目。尤其是那些提供了这么多文件的开源库,我真的不知道如何处理它们......

【问题讨论】:

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


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

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

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

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

    您也可以像这样包含 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.dllkernel32.dll 中没有 GetWindowsDirectory 条目,您的 EXE 将根本无法运行,它将显示严重错误并且不会跑。但是以动态方式(第二种方式),您的应用程序将运行,但是一旦您的代码尝试使用 GetWindowsDirectoryA API,它就会失败。您将在func_GetWindir 中拥有0x00。如果你试图调用它,那么程序将会崩溃。

    【讨论】:

    • 关于#4,我设法编译了 OpenAL 和 freealut(两个开源库),他们也编译了一个 .DLL,如果我只在我的项目中链接/添加文件夹,它会说该项目无法启动,因为计算机中缺少 LIBRARY.DLL。这是否意味着我也必须以某种方式将这些 .DLL 与我的 .EXE 一起发送?我设法通过将 .DLL 放在 Windows/sys32 和 sys64 文件夹中来启动项目,但是有没有办法只将它们放在项目文件夹中?
    • 您可以将它们放在EXE文件的同一个文件夹中,也可以放在System32或Windows文件夹中,不用担心,将它们放在您的EXE文件的同一个文件夹中就可以了
    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多