f1.cpp
文件包含两个简单类的代码。 A
类具有在内部定义的print()
函数,B
类具有在外部定义的函数。
class A{
public:
void print(){}
};
class B{
public:
void print();
};
void B::print(){
}
f1.cpp
将生成f1.lib
。f2.cpp
包含两个类的头和main()
函数(它将与f1.lib
链接以创建f2.exe
):class A{
public:
void print();
};
class B{
public:
void print();
};
int main(){
A a;
a.print();
B b;
b.print();
}
当我在Visual Studio 2019中进行编译时,仅出现类A
的链接错误:error LNK2001: unresolved external symbol "public: void __thiscall A::print(void)" (?print@A@@QAEXXZ)
fatal error LNK1120: 1 unresolved externals
似乎A::print
函数在lib中没有作为符号出现。最初,我认为这是因为内部函数定义默认情况下变为“内联”。但是我尝试在其前面添加
__declspec(noinline)
属性,但仍然无法正常工作。您知道为什么没有该符号吗?
最佳答案
f2.cpp
重新声明了A
和B
,为什么?
两个文件中的B
声明都匹配,这是可以的,链接器会将它们与B::print()
中的外部f1.cpp
定义匹配。
但是两个文件中的A
声明都不匹配,这不正确,并且是未定义的行为。 A
中的f1.cpp
具有自己独特的print()
内联定义,但是A
中的f2.cpp
具有print()
的非内联声明,并且没有匹配的外部定义供链接器查找,因此出错。f2.cpp
根本不应重新声明A
或B
。请改用头文件,例如:
// f1.h
#ifndef F1_H
#define F1_H
class A{
public:
void print() { ... }
// or: void print();
};
#endif
// f1.cpp (only if A::print() is not inline)
#include "f1.h"
void A::print() {
...
}
// f2.h
#ifndef F2_H
#define F2_H
class B{
public:
void print();
};
#endif
//f2.cpp
#include "f1.h"
#include "f2.h"
void B::print() {
...
}
int main() {
A a;
a.print();
B b;
b.print();
}
或者:// f1.h
#ifndef F1_H
#define F1_H
class A{
public:
void print() { ... }
// or: void print();
};
class B{
public:
void print();
};
#endif
//f2.cpp
#include "f1.h"
// uncomment if A::print() is not inline...
/*
void A::print() {
...
}
*/
void B::print() {
...
}
int main() {
A a;
a.print();
B b;
b.print();
}
关于c++ - 类具有内部定义的函数时的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64670427/