未解决的外部符号错误,仅在 header 中定义函数时有效
unresolved extern symbol error, only works when define function in the header
大家,我的第一个post在这里,如果我的风格惹恼了你,请让我知道我想在这里学习如何post。我希望有人能帮我解决这个 LNK2019
错误
我有两个源文件,battleship.cpp 和 tester.cpp,
main()
函数在 Leetcode.cpp 中
该程序将无法编译并给出错误 LNK1120
和 LNK2019
而如果我将 Solution
class 函数定义放在 header 文件 battleship.h
中,程序实际上会编译(并且到目前为止运行良好对于原型)——仍然,我不确定这是否是一个好的做法,因为这些函数不是模板函数,我不能证明将它们放在 .h
文件中
错误信息:
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "public: int __thiscall tom::Solution::boardPrinter(class std::vector<class std::vector<char,class std::allocator<char> >,class std::allocator<class std::vector<char,class std::allocator<char> > > > &)" (?boardPrinter@Solution@tom@@QAEHAAV?$vector@V?$vector@DV?$allocator@D@std@@@std@@V?$allocator@V?$vector@DV?$allocator@D@std@@@std@@@2@@std@@@Z) referenced in function "int __cdecl tom::battleshipTester(void)" (?battleshipTester@tom@@YAHXZ) Leetcode C:\Users\Shin\documents\visual studio 2015\Projects\Leetcode\Leetcode\tester.obj 1
和 battleship.cpp
的代码
#include "stdafx.h"
namespace tom{
class Solution{
public:
int countBattleships(std::vector<std::vector<char>>& board) {
return 0;
}
int boardPrinter(std::vector<std::vector<char>>& board)
{
return 0;
}
int Solution::simpleBoardBuilder(std::vector<std::vector<char>>& board)
{
return 0;
}
};
}
和 battleship.h
的代码
#pragma once
#include "stdafx.h"
namespace tom {
class Solution {
public:
int countBattleships(std::vector<std::vector<char>>& board);
int boardPrinter(std::vector<std::vector<char>>& board);
int simpleBoardBuilder(std::vector<std::vector<char>>& board);
};
}
代码 tester.cpp
#include "stdafx.h"
#include "battleship.h"
namespace tom {
int battleshipTester(void)
{
//called in main function
//call countBattleships
std::vector<std::vector<char>> board;
Solution baseline;
baseline.countBattleships(board);
baseline.boardPrinter(board);
baseline.simpleBoardBuilder(board);
return 0;
}
}
代码 tester.h
#pragma once
#include "stdafx.h"
namespace tom {
int battleshipTester(void);
//int simple
}
Leetcode.cpp的代码也是主要功能
// Leetcode.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "tester.h"
int main()
{
tom::battleshipTester();
return 0;
}
您的代码中存在多个问题:
Battleship.h
不包含在Battleship.cpp
中
- 您已定义
class Solution
两次
- 您已在实施 (
.cpp
) 文件中定义 class Solution
- 您没有在
tester.cpp
中包含 tester.h
错误信息的字面意思是编译器找不到你声明的函数的定义。这是真实的; Battleship.cpp
未包含在内,因此编译器看不到定义。但是,即使它已包含在内,您仍然会遇到错误(请参阅上面编号的项目)。
除了nikaza已经回答的内容,请参考以下评论。
countBattleships(std::vector<std::vector<char>>& board)
错了。你应该在 <char>
之后有一个额外的 space 像下面这样
countBattleships(std::vector<std::vector<char> >& board)
只有这样你的代码才能编译。
虽然您到处都使用了 vector
,但我没有在任何文件中看到任何 #include <vector>
。您可能想要 #include <vector>
在您的 .h 文件中
battleship.cpp 应该看起来像这样:
#include "battleship.h"
namespace tom{
int Solution::countBattleships(std::vector<std::vector<char> >& board) {
return 0;
}
int Solution::boardPrinter(std::vector<std::vector<char> >& board)
{
return 0;
}
int Solution::simpleBoardBuilder(std::vector<std::vector<char> >& board)
{
return 0;
}
}
tester.cpp 应该看起来像这样:
#include "tester.h"
#include "battleship.h"
namespace tom {
int battleshipTester(void)
{
//called in main function
//call countBattleships
std::vector<std::vector<char> > board;
Solution baseline;
baseline.countBattleships(board);
baseline.boardPrinter(board);
baseline.simpleBoardBuilder(board);
return 0;
}
}
battleship.h 应该看起来像这样:
#pragma once
#include <vector>
namespace tom {
class Solution {
public:
int countBattleships(std::vector<std::vector<char> >& board);
int boardPrinter(std::vector<std::vector<char> >& board);
int simpleBoardBuilder(std::vector<std::vector<char> >& board);
};
}
tester.h 应该看起来像这样:
#pragma once
namespace tom {
int battleshipTester(void);
//int simple
}
最后 leetcode.cpp 应该是这样的:
#include "tester.h"
int main()
{
tom::battleshipTester();
return 0;
}
大家,我的第一个post在这里,如果我的风格惹恼了你,请让我知道我想在这里学习如何post。我希望有人能帮我解决这个 LNK2019
错误
我有两个源文件,battleship.cpp 和 tester.cpp,
main()
函数在 Leetcode.cpp 中
该程序将无法编译并给出错误 LNK1120
和 LNK2019
而如果我将 Solution
class 函数定义放在 header 文件 battleship.h
中,程序实际上会编译(并且到目前为止运行良好对于原型)——仍然,我不确定这是否是一个好的做法,因为这些函数不是模板函数,我不能证明将它们放在 .h
文件中
错误信息:
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "public: int __thiscall tom::Solution::boardPrinter(class std::vector<class std::vector<char,class std::allocator<char> >,class std::allocator<class std::vector<char,class std::allocator<char> > > > &)" (?boardPrinter@Solution@tom@@QAEHAAV?$vector@V?$vector@DV?$allocator@D@std@@@std@@V?$allocator@V?$vector@DV?$allocator@D@std@@@std@@@2@@std@@@Z) referenced in function "int __cdecl tom::battleshipTester(void)" (?battleshipTester@tom@@YAHXZ) Leetcode C:\Users\Shin\documents\visual studio 2015\Projects\Leetcode\Leetcode\tester.obj 1
和 battleship.cpp
的代码#include "stdafx.h"
namespace tom{
class Solution{
public:
int countBattleships(std::vector<std::vector<char>>& board) {
return 0;
}
int boardPrinter(std::vector<std::vector<char>>& board)
{
return 0;
}
int Solution::simpleBoardBuilder(std::vector<std::vector<char>>& board)
{
return 0;
}
};
}
和 battleship.h
的代码#pragma once
#include "stdafx.h"
namespace tom {
class Solution {
public:
int countBattleships(std::vector<std::vector<char>>& board);
int boardPrinter(std::vector<std::vector<char>>& board);
int simpleBoardBuilder(std::vector<std::vector<char>>& board);
};
}
代码 tester.cpp
#include "stdafx.h"
#include "battleship.h"
namespace tom {
int battleshipTester(void)
{
//called in main function
//call countBattleships
std::vector<std::vector<char>> board;
Solution baseline;
baseline.countBattleships(board);
baseline.boardPrinter(board);
baseline.simpleBoardBuilder(board);
return 0;
}
}
代码 tester.h
#pragma once
#include "stdafx.h"
namespace tom {
int battleshipTester(void);
//int simple
}
Leetcode.cpp的代码也是主要功能
// Leetcode.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "tester.h"
int main()
{
tom::battleshipTester();
return 0;
}
您的代码中存在多个问题:
Battleship.h
不包含在Battleship.cpp
中
- 您已定义
class Solution
两次 - 您已在实施 (
.cpp
) 文件中定义class Solution
- 您没有在
tester.cpp
中包含
tester.h
错误信息的字面意思是编译器找不到你声明的函数的定义。这是真实的; Battleship.cpp
未包含在内,因此编译器看不到定义。但是,即使它已包含在内,您仍然会遇到错误(请参阅上面编号的项目)。
除了nikaza已经回答的内容,请参考以下评论。
countBattleships(std::vector<std::vector<char>>& board)
错了。你应该在 <char>
之后有一个额外的 space 像下面这样
countBattleships(std::vector<std::vector<char> >& board)
只有这样你的代码才能编译。
虽然您到处都使用了 vector
,但我没有在任何文件中看到任何 #include <vector>
。您可能想要 #include <vector>
在您的 .h 文件中
battleship.cpp 应该看起来像这样:
#include "battleship.h"
namespace tom{
int Solution::countBattleships(std::vector<std::vector<char> >& board) {
return 0;
}
int Solution::boardPrinter(std::vector<std::vector<char> >& board)
{
return 0;
}
int Solution::simpleBoardBuilder(std::vector<std::vector<char> >& board)
{
return 0;
}
}
tester.cpp 应该看起来像这样:
#include "tester.h"
#include "battleship.h"
namespace tom {
int battleshipTester(void)
{
//called in main function
//call countBattleships
std::vector<std::vector<char> > board;
Solution baseline;
baseline.countBattleships(board);
baseline.boardPrinter(board);
baseline.simpleBoardBuilder(board);
return 0;
}
}
battleship.h 应该看起来像这样:
#pragma once
#include <vector>
namespace tom {
class Solution {
public:
int countBattleships(std::vector<std::vector<char> >& board);
int boardPrinter(std::vector<std::vector<char> >& board);
int simpleBoardBuilder(std::vector<std::vector<char> >& board);
};
}
tester.h 应该看起来像这样:
#pragma once
namespace tom {
int battleshipTester(void);
//int simple
}
最后 leetcode.cpp 应该是这样的:
#include "tester.h"
int main()
{
tom::battleshipTester();
return 0;
}