Visual Studio中的C++程序如何使用第三方静态库和动态库?

1,888 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

以 SketchUp C SDK(SKP_SDK_WIN_x64_2022-0-354)为例,我们来聊一下工程中如何使用第三方的静态库和动态库。以Windows操作系统,VS2019为例,看下我们们的C++工程如何进行配置链接。

以下分别是原始的lib、dll、头文件所存放的位置。

image.png

image.png

image.png

一、添加库文件路径

在 Visual Studio 2019 中,可以通过在项目属性页面中添加库文件的目录,让编译器知道需要链接的库文件的位置。具体步骤如下:

  • 打开项目属性页面:在“解决方案资源管理器”中右键单击要配置的项目,选择“属性”菜单项。

    image.png

  • 选择“VC++ 目录”选项卡:在“属性页”中选择“VC++ 目录”选项卡。

    image.png

  • 添加包含目录:在“包含目录”中添加库文件的路径,包括 .h 文件所在的目录。

    image.png

  • 添加库目录:在“库目录”中添加库文件的路径,包括 .lib 文件所在的目录和 .dll 文件所在的目录。

    image.png

二、添加库文件名

同样是在项目属性页面中添加库文件的名称,让编译器知道需要链接的库文件的名称。具体步骤如下:

  • 打开项目属性页面:在“解决方案资源管理器”中右键单击要配置的项目,选择“属性”菜单项。

  • 选择“链接器”选项卡:在“属性页”中选择“链接器”选项卡。

    image.png

  • 添加库文件名:在“输入”中添加要链接的库文件名,包括 .lib 文件和 .dll 文件的名称。

    image.png

三、注意

需要注意的是,对于 .dll 文件,还需要将其复制到可执行文件所在的目录下。也就是需要拷贝SketchUpAPI.dll,SketchUpAPI.dll到程序运行后的可执行文件TestSkpSDK.exe所在的文件夹,如下所示。

image.png

除了将 DLL 文件复制到可执行文件所在的目录下,还可以通过设置动态链接库的路径来指定 DLL 文件的位置。具体来说,可以通过以下方法之一来设置动态链接库的路径:

  1. 使用 SetDllDirectory 函数来设置 DLL 文件所在目录的路径。

    #include <Windows.h>
    
    int main() {
      SetDllDirectory(L"C:\\path\\to\\dlls");
      // ...
      return 0;
    }
    
  2. 在程序中使用 LoadLibrary 函数加载 DLL 文件时,指定 DLL 文件的完整路径。

    #include <Windows.h>
    
    int main() {
      HMODULE hDll = LoadLibrary(L"C:\\path\\to\\mydll.dll");
      if (hDll == NULL) {
        // 处理加载失败的情况
      }
      // ...
      FreeLibrary(hDll);
      return 0;
    }
    
  3. 在程序中使用 LoadLibraryEx 函数加载 DLL 文件时,指定 DLL 文件的路径以及一些其他的加载选项,如 LOAD_WITH_ALTERED_SEARCH_PATH。

    #include <Windows.h>
    
    int main() {
      HMODULE hDll = LoadLibraryEx(L"C:\\path\\to\\mydll.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
      if (hDll == NULL) {
        // 处理加载失败的情况
      }
      // ...
      FreeLibrary(hDll);
      return 0;
    }
    

这些方法可以避免将 DLL 文件复制到可执行文件所在的目录下,但也可能带来一些其他的问题,比如 DLL Hell,因此需要根据具体的情况进行选择。我们这里暂时就选择最简单的拷贝方式了。