我正在尝试在我的项目中使用 yaml-cpp。我正在使用 Visual Studio 2022。
我从github下载了代码(https://github.com/jbeder/yaml-cpp)
我浏览了 github 页面上的教程,最终在“Program Files (x86)”中找到了一个名为“YAML_CPP”的文件夹。它有一个名为“include”的子文件夹,其中包含头文件,另一个名为“lib”的子文件夹,包含一个 .lib 文件。
我在本教程中使用的 cmake 命令是:
cmake -G "Visual Studio 17 2022" -DYAML_BUILD_SHARED_LIBS=OFF ..
我在 Visual Studio 中启动一个新的 C++ 控制台项目,然后打开 “项目”->“属性” 并使用以下设置:
“配置属性”->“C/C++”->“常规”->“其他包含目录” =“C:\Program Files %28x86%29\YAML_CPP\include”(我使用“select文件夹”对话框)
“配置属性”->“链接器”->“常规”->“其他库目录” =“C:\Program Files %28x86%29\YAML_CPP\lib”(我使用“选择文件夹”添加文件夹对话框)
“配置属性”->“链接器”->“输入”->“附加依赖项” =“yaml-cppd.lib”(“YAML_CPP”文件夹中“lib”文件夹中的lib的名称,这是手动添加的)。
以下是我的基本测试,编译没有问题:
#include <iostream>
#include "yaml-cpp/yaml.h"
int main()
{
std::cout << "Hello World!\n";
}
这是我收到错误的地方:
#include <iostream>
#include "yaml-cpp/yaml.h"
int main()
{
YAML::Emitter out;
std::cout << "Hello World!\n";
}
1>ConsoleApplication1.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl YAML::Emitter::Emitter(void)" (__imp_??0Emitter@YAML@@QEAA@XZ) referenced in function main
1>ConsoleApplication1.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl YAML::Emitter::~Emitter(void)" (__imp_??1Emitter@YAML@@QEAA@XZ) referenced in function main
1>C:\Users\Fridrik\source\repos\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe : fatal error LNK1120: 2 unresolved externals
我很确定在链接方面我做错了什么,但我无法弄清楚我做错了什么。
我不确定你是否已经解决了这个问题,但我刚刚自己解决了这个问题。
include/yaml-cpp/dll.h
中有一个宏,用于检查YAML_CPP_STATIC_DEFINE
是否已定义。
如果未定义,它将尝试使用
__declspec(dllimport)
导入必要的代码,该代码从 .dll 导入代码
在定义的地方,它不会查找 .dll 文件。
您需要将代码更新为以下内容,以确保该库作为静态库运行,而不是依赖于 .dll 文件的共享库。
#include <iostream>
#define YAML_CPP_STATIC_DEFINE
#include "yaml-cpp/yaml.h"
int main()
{
YAML::Emitter out;
std::cout << "Hello World!\n";
}