c++ - 从 cpp 文件内联函数时出现链接器错误

标签 c++ linker-errors unresolved-external

我在执行以下操作时遇到链接器(未解析的外部符号)错误:

-我有一个“Object”类 - 它在“object.h”中定义。

它有一个像这样的构造函数:explicit Object(double x,/* lots more */);

在文件“object.cpp”中,我想给构造函数一个主体:Object::object(double x) : _x(x) {}

这有效.. 但是,如果我在“object.cpp”文件中添加关键字“inline”:

inline Object::Object(double x) : _x(x) {}

突然弹出链接器错误! “错误 LNK2019:无法解析的外部符号”

为什么? - 这是否意味着我不能对构造函数使用内联?

编辑:实际上我注意到所有方法都是如此。 但是 如果我将所有方法移动到object.h header 文件,它就可以工作。您不能从定义对象的头文件外部内联函数吗?

EDIT2:好的,这是一个重大更新,我决定构建一个快速测试用例:
ma​​in.cpp:

#include "a.h"
int main ()
{
    a t;
    t.test(5);
    return 0;
}

啊.h

class a {
public:
    void test (int x);
};

a.cpp

#include <iostream>
#include "a.h"
inline void a::test(int x) {
    std::cout << x << std::endl;
}

这会产生以下错误:

main.obj : error LNK2019: unresolved external symbol "public: void __thiscall a::test(int)" (?test@a@@QAEXH@Z) referenced in function _main

删除“inline”关键字使程序运行。将“a.h”和“a.cpp”合并到 1 个文件中也是如此。

我真的想不出更多信息可以提供:/

最佳答案

您需要了解有关标记为inline 的函数的定义规则。

将函数标记为内联 意味着您可以在程序中的多个翻译单元中定义该函数(但每个翻译单元只能定义一次)但是所有定义必须相同并且您必须在使用该函数的每个翻译单元中提供定义。

在您的示例中,main.cpp 中的翻译单元使用 a::test(int) 但该翻译单元中没有定义。 a.cpp 的翻译单元中有一个定义,但这里标记为 inline 这意味着你不能在 的翻译单元中留下定义>main.cpp.

我不确定为什么要将 inline 添加到 a.cpp 中的定义中,因为它没有必要或没有用。 inline 允许您将函数定义放在共享头文件中,但如果您想将函数放在源文件中,它就没有用了。

关于c++ - 从 cpp 文件内联函数时出现链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220684/

相关文章:

c++ - SFML 不播放任何声音,但没有错误

ios - 尝试在 xcode 中播放 .mp3 音效时出现奇怪的错误?

c++ - fatal error LNK1127 : library is corrupt --> after adding extern "C" to function prototype

c++ - 错误: Invalid preproccessing directive #i did you mean #if?

c++ - 如何检查一组值中的一个是否相等?

c++ - 如何使用 Visual C++ 2010 Express 设置 SAPI?

c - 如何链接linux/gpio.h?

c++ - 带有 VS 2017 的 QT 5.9 - 使用 QWebEngineView 获取未解析的符号

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 是什么导致我收到链接器错误 LNK2019?