我在执行以下操作时遇到链接器(未解析的外部符号)错误:
-我有一个“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:好的,这是一个重大更新,我决定构建一个快速测试用例:
main.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/