函数中引用了未解决的外部符号

5

我知道如果不提供大量的代码,这个问题很难回答(我会尽量避免)。

基本上,在X类中,我得到了一个错误,它包含Y类头文件。Y类头文件有三个getter的定义。

// Getters
static ID3D10Device* PDevice();
static ID3D10Buffer* PBuffer();
static ID3D10Buffer* IBuffer();

我收到了三个相同的错误,全部出现在X类中。所以本质上错误是:

未解决的外部符号 ID3D10Device* PDevice() 在类 X 的构造函数中被引用

如果我的表述有点模糊,请谅解。这是为什么呢?你有什么想法吗?我已经在谷歌上搜索过了,但我只能根据自己的想法做出合理的猜测。


3
这是链接错误,而不是编译器错误。你是否正确地链接了D3D库? - Kerrek SB
你是否编译了这些函数的定义? - mloskot
所有这些代码以前都能正常工作,但现在我将它们分成了不同的类,就出现了一些问题。 - Dollarslice
4个回答

6

首先,这是一个链接错误。

这个链接错误意味着找不到名称为PDevice等的符号。

请确保您有与定义相匹配的函数实现。

同时,请检查您是否实际上有一个实现。

如果您的实现在外部库中,请确保您已经将其他库包含到链接器中。

希望能对您有所帮助!


是的,谢谢!问题在于像个白痴一样,我没有在定义前面加上 ClassY::。 - Dollarslice

2

请确保将包含类Y的定义和实现的文件添加到项目中,以便链接器可以在Y.o文件中找到这些符号。


1

确保您正确设置依赖项(添加lib文件)。在Visual Studio中,您可以通过属性 -> 链接器 -> 输入 -> 附加依赖项来执行此操作。在文本框中,您现在可以输入您的.lib文件的名称。


0

这种情况发生的另一个原因是使用C和C++源文件创建二进制文件。编译器对于C符号和C++符号使用不同的命名机制。请阅读“将C++加入到图像中”部分在这篇优秀文章中,例如,C++中的函数重载是其中之一。函数的符号名称包括函数签名(参数类型及其顺序)。引用文章中的话,“所有有关函数签名的信息都被编码成文本形式,并成为链接器实际看到的符号名称。”因此,当C代码文件需要调用在C++文件中定义的函数时,C代码的目标文件仅提及该C++函数的名称(不包括函数签名)。然而,C++目标文件包含了编码后的名称(其中包括函数签名)。因此,链接器报告了“错误LNK2019:未解析的外部符号FOO_CPP_FUNC,该符号在BAR_C_FUNC中被引用”。建议的解决方案是在C++函数的声明和定义周围添加extern "C"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接