首先,这是hw,我应该只改变一个功能。但我不是在这里寻求帮助,我在这里是因为LNK错误。
在我输入cl shortest.cpp后,在Developer命令提示符下的相关输出(错误之间有空格以便于阅读):
shortest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Graph::readFile(char *)" (?readFile@Graph@@QAEXPAD@Z) referenced in function _main
shortest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Graph::dijkstra(int)" (?dijkstra@Graph@@QAEXH@Z) referenced in function _main
shortest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Graph::printPath(int)" (?printPath@Graph@@QAEXH@Z) referenced in function _main
shortest.exe : fatal error LNK1120: 3 unresolved externals
我理解这应该意味着我还没有定义这些符号,但它们应该是在两个文件之一中为我预定义的:graph.cpp或graph.h。 Graph.h似乎更有可能,因为它包含了这些"未解决的"符号。
graph.h:
#include <iostream>
#include <fstream>
#include <vector>
#include <limits.h>
#include <cstdlib>
#define INFINITY INT_MAX
using namespace std;
class Graph
{
struct Edge
{
int dest; // destination vertex number
int cost; // edge weight
Edge *next;
};
struct Vertex
{
Edge *adj;
bool known;
int dist;
int path;
};
vector<Vertex *> vertices;
vector<int> PQ;
int PQsize;
void PQinsert (int v);
int PQdeleteMin ();
public:
Graph () { PQsize=0; }
int numVertices () { return vertices.size(); }
int dist (int dest) { return vertices[dest]->dist; }
void readFile (char *name);
void dijkstra (int start);
void printPath (int dest);
};
除非有要求,否则我不会发布graph.cpp或shortest.cpp(仅包含主要内容),因为在我看来相关功能的内容是个问题。如果我这样做,我只会发布相关的方法来缩短它。但graph.cpp,graph.h和shortest.cpp都在同一个文件夹中。而shortest.cpp确实包含graph.h。我只是应该改变dijkstra方法,但是如果我能添加一些东西来进行编译而不改变方法或类本身的工作方式(它不应该这样做)我不会看到问题。
答案 0 :(得分:0)
您必须使用make文件来构建所有源文件。否则,您可以先编译源,然后手动链接。在google上搜索用于编译/链接的各个命令。