'undefined reference' 和 'not declared'
'undefined reference' with 'not declared'
这是一个简单的c编译链接问题。但是我想讨论一下编译器和链接器的原理
void f();
int main()
{
f();
}
此代码收到错误消息"undefined reference to 'f()'"
int main()
{
f();
}
此代码收到错误消息"f was not declared in this scope"
有什么区别?
更重要的是,代码
void f()
{
}
int main()
{
f();
}
运行良好。
在第一种情况下,您声明了一个函数,但没有定义它。它可以正确编译,但不能 link,因为没有 f
的定义。因此 linker 错误。
在第二种情况下,您尝试调用未声明的符号。编译器不知道 f
是什么,所以会报错。这是编译过程不同阶段的不同问题,所以消息是不同的。
在第三种情况下,您有一个定义明确的程序(除了 main
无法 return 一个值)。 f
已声明和定义。程序应该编译,link,并正确执行。
澄清这个问题。您应该知道代码如何成为可执行程序。
第一步是"Compile"。将您的源代码编译成二进制文件 *.o 文件。
第二个if "Link"。将您的 *.o 文件合并为可执行文件。
在您的第一个示例中,您声明了函数 f
,但没有定义它。所以当链接器链接*.o文件时,它找不到函数f
。
在你的第二个例子中,你使用函数 f
没有声明或实现。所以Compiler报错。
在您的第三个示例中,函数 f
实现领先使用它。没错。
这是一个简单的c编译链接问题。但是我想讨论一下编译器和链接器的原理
void f();
int main()
{
f();
}
此代码收到错误消息"undefined reference to 'f()'"
int main()
{
f();
}
此代码收到错误消息"f was not declared in this scope" 有什么区别? 更重要的是,代码
void f()
{
}
int main()
{
f();
}
运行良好。
在第一种情况下,您声明了一个函数,但没有定义它。它可以正确编译,但不能 link,因为没有 f
的定义。因此 linker 错误。
在第二种情况下,您尝试调用未声明的符号。编译器不知道 f
是什么,所以会报错。这是编译过程不同阶段的不同问题,所以消息是不同的。
在第三种情况下,您有一个定义明确的程序(除了 main
无法 return 一个值)。 f
已声明和定义。程序应该编译,link,并正确执行。
澄清这个问题。您应该知道代码如何成为可执行程序。
第一步是"Compile"。将您的源代码编译成二进制文件 *.o 文件。
第二个if "Link"。将您的 *.o 文件合并为可执行文件。
在您的第一个示例中,您声明了函数 f
,但没有定义它。所以当链接器链接*.o文件时,它找不到函数f
。
在你的第二个例子中,你使用函数 f
没有声明或实现。所以Compiler报错。
在您的第三个示例中,函数 f
实现领先使用它。没错。