如何将 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
所在的文件夹。
我只是忘了将生成的.lib 文件(nfd.lib) 的路径添加到Projects->Properties->Linker->Input Additional Dependencies。完成此操作后,一切正常。
我正在尝试将 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
所在的文件夹。
我只是忘了将生成的.lib 文件(nfd.lib) 的路径添加到Projects->Properties->Linker->Input Additional Dependencies。完成此操作后,一切正常。