在 Visual Studio 中链接 yaml-cpp

问题描述 投票:0回答:1

我正在尝试在我的项目中使用 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

我很确定在链接方面我做错了什么,但我无法弄清楚我做错了什么。

c++ linker-errors static-linking yaml-cpp
1个回答
0
投票

我不确定你是否已经解决了这个问题,但我刚刚自己解决了这个问题。

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";
}
© www.soinside.com 2019 - 2024. All rights reserved.