如何将 C 库添加到 Visual Studio 项目

How to add C library to Visual Studio project

我正在尝试将 https://github.com/mlabbe/nativefiledialog 这个 C 库添加到我在 visual studio 2022 年的 C++ 项目中。我已经构建并生成了 .lib 文件,并通过转到项目将其添加到我的项目中->属性->链接器。我将此 .lib 文件的路径添加到其他库目录中。这样做之后,我仍然收到“未解析的外部符号”链接器错误。特别是 LNK2019 和 LNK1120。我还将头文件添加到附加包含目录中。我还缺少哪些其他步骤?

提前感谢您的帮助!

编辑:

代码实现如下:

StartupLayer.h

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>

#include "Walnut/Application.h"

#include "ExcelReader.h"
#include "nfd.h"

#define BUFFER_SIZE 255

class StartupLayer : public Walnut::Layer {

private:

    ExcelReader reader;
    char inputPath[BUFFER_SIZE] = "enter folder";

public:

    StartupLayer() : reader(ExcelReader()) {}

    ~StartupLayer() {}

    virtual void OnUIRender() override;

};

StartupLayer.cpp

#include "StartupLayer.h"

void StartupLayer::OnUIRender() {

    ImGui::Begin("Select Folder");
    ImGui::InputText("select folder", inputPath, BUFFER_SIZE);

    // when browse button is clicked
    if (ImGui::Button("Browse")) {

        nfdchar_t* outpath = NULL;
        nfdresult_t result = NFD_OpenDialog(NULL, NULL, &outpath);
    }

    ImGui::End();
}

这是一个 Dear ImGui 项目,我想在我的其中一个图层中使用这个打开的文件对话框库。上面的代码是 class 层,我在 NFD_OpenDialog 函数调用中得到了未解析的外部符号。

C代码

C 应用程序只包含一个小功能:

// ./code/c/lib.c

#include <stdio.h>

__declspec(dllexport) void f()
{
    printf("\n This is a C code\n");
}

关键字 __declspec(dllexport) 仅在 Microsoft 编译器世界中有效并导出该函数。

编译 C

打开 Visual Studio 开发人员命令提示符并导航到 C 项目所在的文件夹。然后只需键入:cl /LD lib.c。这将创建两个文件。一个 lib.lib 和一个 lib.dll.

C++ 代码

也没什么特别的。首先你需要头文件:

// ./code/cpp/Console/Console/Header.h

#pragma once

extern "C" {
  __declspec(dllimport) void f();
}

您再次找到 declspec,但这次它是用 dllimport 指定的,这在您导入函数时非常有意义

我们的应用程序:

// ./code/cpp/Console/Console/Console.cpp

#include <iostream>
#include "Header.h"
#pragma comment(lib, "../../../c/lib.lib")

int main()
{
  f();
}

请注意 #pragma comment(lib, "../../../c/lib.lib") 行,它指定了 .lib 的位置,因此链接器能够引用函数 f().

执行

如果你现在执行Console.exe你会得到一个错误,因为找不到dll。要解决此问题,只需将 lib.dll 复制到 Console.exe 所在的文件夹。

Source.

我只是忘了将生成的.lib 文件(nfd.lib) 的路径添加到Projects->Properties->Linker->Input Additional Dependencies。完成此操作后,一切正常。