【问题标题】:Getting linking errors when using header CPP使用标头 CPP 时出现链接错误
【发布时间】:2020-07-26 10:35:32
【问题描述】:

我在 Visual Studio 2019 中创建了一个帮助读取 .csv 文件的类(该类称为 CsvReader)。

#pragma once

#include <string>
#include <vector>
#include <unordered_map>
#include <fstream>

namespace csv
{
    class CsvReader
    {
    private:
        std::string fileName;
        std::vector<std::vector<std::string>> content;
        std::unordered_map<std::string, int> fieldIndex;
        std::unordered_map<int, std::string> indexField;

    public:
        CsvReader(const char* file);
        void loadFile(const char* file);
        std::vector<std::vector<std::string>> items();
        int fieldToIndex(std::string field);
        std::string indexToField(int index);
        size_t fieldCount();
        void print();
        void trim(const char symbol);
    };
}

我想在不同的解决方案中使用该类来读取 .csv 文件。 CsvReader 的配置类型是动态库(.dll)。

当我尝试在我想在其中使用 CsvReader 的项目中 #include "CsvReader.h" 时,程序会识别该类,但是当我运行该程序时,会出现两个链接错误。

function_main 中引用的 LNK2019 未解析的外部符号“public:_thiscall csv::CsvReader(char const*)”(??0CsvReader@csv@@QAE@PBD@Z)

function_main 中引用的 LNK2019 未解析的外部符号“public:void_thiscall csv::CsvReader::print(void)”(?print@CsvReader@csv@@QAEXXZ)

我真的不明白我做错了什么。

我要在其中使用该类的程序:

#include "../../Classes/CsvReader/CsvReader/CsvReader.h" // I know it's a pretty long path
#include <iostream>

int main()
{
    csv::CsvReader test1 ("TestCases/test.csv");
    test1.print();

    return 0;
}

我定义所有函数的.CPP文件很大,不知道有没有必要。

【问题讨论】:

  • 您的main() 所在的项目需要在编译/链接时链接到CsvReader.lib,以便在运行时打开CsvReader.dll 以执行运行时链接。
  • 如果可以的话,您应该将所有项目都放在一个解决方案下,并添加项目之间的所有正确引用,VS 将为您整理链接过程。
  • 但是如果我想在 GitHub 上与其他人分享我的课程,他们不能这样做,对吗?如果我想在多个项目中使用我的课程,我会得到一个非常大的解决方案。如何将 CsvReader.lib 链接到我的 main() 所在的项目?
  • 如果 GitHub 上的其他人使用您的代码,那么是否将您的代码直接包含到他们的项目中,或者作为单独的静态或动态库将取决于他们。对您来说,如果CsvReader 是一个完全独立的解决方案,那么您需要一个文件夹,其中包含一个用于标题的headers 子文件夹和一个用于.lib.dll 文件的lib 文件夹。然后告诉编译器headers 文件夹的位置和链接器lib 文件夹的位置和.lib 文件的名称。 (我认为,然后,在运行时它会自动整理到.dll 的链接)
  • 我如何告诉编译器和链接器这些位置?有没有办法让 Visual Studio 自动将 headers 放入 headers 文件夹并将 .lib 和 .dll 文件放入 lib 文件夹?

标签: c++ dll


【解决方案1】:

据我所知,至少涉及两个项目:一个名为 CsvReader 的 DLL 和一个可执行文件(我将把它称为 CsvUser,直到我' m 以其他方式更正)。

在尝试构建 CsvUser 之前,您应该确保 CsvReader 已构建。还要注意build是设置为“Release”还是“Debug”,设置为x86还是x64。

看起来正在使用“Release”,为简单起见,我将假设 x86。在构建之后,您的 CsvReader 上方应该有一个 Release 文件夹(您的 CsvReader 项目的解决方案目录)。

一旦你有了你的发布文件夹(无论它在哪里),打开 CsvUser 项目的属性窗口。

转到“配置属性”-->“VC++ 目录”-->“库目录”。输入“CsvReader”项目的Release文件夹的位置。

这会让编译器知道 CsvReader 的库在哪里。现在它需要知道要查看哪个库。

在“属性”窗口中,转到:

“配置属性”-->“链接器”-->“输入”-->“附加依赖”。确保包含“CsvReader.lib”。

我的这个 Github 是我经验的基本演示:https://github.com/TrecApps/DLL-Demo

请注意,我的项目在同一个解决方案中。我没有测试过两种不同解决方案的 DLL/应用程序交互,所以我不知道可能会出现其他复杂情况。

此外,由于涉及两种解决方案,请确保解决方案在发布/调试以及 x86 与 x64 方面位于同一页面上。

【讨论】:

  • 谢谢!现在可以了!我确实必须将配置类型从 dll 更改为 lib,但我认为这并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 2018-04-07
  • 2014-10-05
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多