链接类文件时无法解析的外部符号,Visual Studio

Unresolved external symbol while linking class files, Visual studio

提问人:Mira 提问时间:7/17/2020 更新时间:7/17/2020 访问量:185

问:

项目中有三个文件:

HAT_array.h:

#pragma once

class HAT_array {
public:
    HAT_array();
};

HAT_array.cpp:

#include "HAT_array.h"

inline HAT_array::HAT_array() {
    return;
}

测试.cpp:

#include "HAT_array.h"

int main(void) {
    HAT_array HAT;
}

在构建解决方案时,我收到一个未解决的外部符号错误:

1>------ Build started: Project: HashedArrayTree, Configuration: Release Win32 ------
1>HAT_array.cpp
1>test.cpp
1>test.obj : error LNK2001: unresolved external symbol "public: __thiscall HAT_array::HAT_array(void)" (??0HAT_array@@QAE@XZ)
1>C:\Users\myros\Desktop\HashedArrayTree\Release\HashedArrayTree.exe : fatal error LNK1120: 1 unresolved externals
1>Done building project "HashedArrayTree.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
C++ visual-studio-2019 未解析外部

评论

2赞 Alexey S. Larionov 7/17/2020
inline表示内部链接,即任何标记为内部链接的内容都不会在其定义位置之外看到。所以这就是你尝试过的。在您尝试调用未看到的构造函数时。删除HAT_array.cpptest.cppinline
0赞 drescherjm 7/17/2020
无论如何,您在大多数情况下都不应该使用。编译器将不再将其用作内联代码的提示。由于函数的关键字内联的含义意味着“允许多个定义”而不是“内联是首选”,因此该含义被扩展到变量。这里有更多信息: https://en.cppreference.com/w/cpp/language/inlineinline
0赞 Asteroids With Wings 7/17/2020
@AlexLarionov您可以将答案放在问题下方的可爱答案部分。评论用于要求澄清。谢谢。

答:

3赞 Asteroids With Wings 7/17/2020 #1

你为什么要标记定义?inline

这给了它内部联系,所以没有其他翻译单位可以“看到”它。

当您想将这些定义放在头文件中时,将其放在定义上可能很有用,但这不是您在此处所做的。

删除内联

2赞 Alexey S. Larionov 7/17/2020 #2

inline关键字意味着内部链接,即任何标记为此类内容都不会在定义它的地方之外(或严格地说是这个翻译单元)看到。HAT_array.cpp

因此,您尝试调用未看到的构造函数定义。删除关键字,不要使用它,正如@drescherjm所指出的那样。除非你真的知道自己在做什么,否则你不太可能从中获得任何好处。test.cppinline