【发布时间】: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 文件夹?