0

Пишу курсач на тему "Дерево Меркла для хеш функций", написал код реализации дерево меркла, сам хеш-генератор взял у https://github.com/okdshin, при попытки компиляции main.cpp, который содержит следующий код

#include <iostream>
#include "TreeStruct.h"

int main() { std::vector<Node*> leaves;

//create sample data
leaves.push_back(new Node(hash_sha256(&quot;aksl;fjk;kla&quot;)));
leaves.push_back(new Node(hash_sha256(&quot;1234&quot;)));

// initialize leaves
for (unsigned int i = 0; i &lt; leaves.size(); i++) {
    leaves[i]-&gt;left = NULL;
    leaves[i]-&gt;right = NULL;
}

MerkleTree* hashTree = new MerkleTree(leaves);
std::cout &lt;&lt; hashTree-&gt;root-&gt;hash &lt;&lt; std::endl;
hashTree-&gt;printTree(hashTree-&gt;root, 0);

for (unsigned int k = 0; k &lt; leaves.size(); k++) {
    delete leaves[k];
}

delete hashTree;

return 0;

}

Получаю ошибку

Ошибка LNK2019 ссылка на неразрешенный внешний символ "public: __thiscall Node::Node(class std::basic_string<char,struct std::char_traits,class std::allocator >)" (??0Node@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) в функции _main. Mercle_tree_cour C:\Users\Konstantin\source\repos\Mercle_tree_cour\Mercle_tree_cour\main.obj 1

При этом в самой реализации дерева меркла тоже все вроде как нормально

#include <string>
#include <unordered_map>
#include <iostream>
#include <iomanip>
#include "SHA256.h"
#include <vector>
#include "misc.h"
#include <string>
#include "TreeStruct.h"

using namespace std;

MerkleTree::MerkleTree(std::vector<Node> blocks) { std::vector<Node> nodes; while (blocks.size() != 1) { printNodeHashes(blocks); for (unsigned int l = 0, n = 0; l < blocks.size(); l = l + 2, n++) { if (l != blocks.size() - 1) { nodes.push_back(new Node(hash_sha256(blocks[l]->hash + blocks[l + 1]->hash))); nodes[n]->left = blocks[l]; nodes[n]->right = blocks[l + 1]; } else { nodes.push_back(blocks[l]); } } std::cout << "\n"; blocks = nodes; nodes.clear();

}
this-&gt;root = blocks[0];

}

MerkleTree::~MerkleTree() { deleteTree(root); std::cout << "Tree deleted" << std::endl; }

void MerkleTree::printTree(Node* n, int indent) { if (n) { if (n->left) { printTree(n->left, indent + 4); } if (n->right) { printTree(n->right, indent + 4); } if (indent) { std::cout << std::setw(indent) << ' '; } std::cout << n->hash[0] << "\n "; } }

void MerkleTree::deleteTree(Node* n) { if (n) { deleteTree(n->left); deleteTree(n->right); n = NULL; delete n; } }

Но компилятор и на него показывает мол есть ошибка "Неразрешенный внешний символ"

Ошибка LNK2001 неразрешенный внешний символ "public: __thiscall Node::Node(class std::basic_string<char,struct std::char_traits,class std::allocator >)" (??0Node@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z). Mercle_tree_cour C:\Users\Konstantin\source\repos\Mercle_tree_cour\Mercle_tree_cour\Mercle_tree_cour.obj 1

Помогите понять в чем может быть проблема

UPD:

misc.h

#pragma once #ifndef MISC_H #define MISC_H

#include <iostream> #include <string> #include "TreeStruct.h" #include "SHA256.h"

inline std::string hash_sha256(std::string src_str) { std::string hash_hex_str = picosha2::hash256_hex_string(src_str); return hash_hex_str; }

inline void printNodeHashes(std::vector<Node*> v) { for (unsigned int a = 0; a < v.size(); a++) { std::cout << v[a]->hash << std::endl; } } #endif

TreeStruct.h

#pragma once
#include <vector>
#include <string>
#include <iostream>
#include "Node.h"
#include "SHA256.h"
#include "misc.h"

struct MerkleTree {
    Node* root;
    MerkleTree(std::vector<Node*> blocks);
    ~MerkleTree();
    void printTree(Node* n, int indent);
    void deleteTree(Node* n);
};
Node.h

#pragma once
#ifndef NODE_H
#define NODE_H

#include <string>

struct Node {
    std::string hash;
    Node* left;
    Node* right;

    Node(std::string data);
};

#endif

0 Answers0