链接错误与编译错误

Mar*_*oun 5 c c++ compiler-construction linker

为什么结构的双重声明会导致编译错误,而函数的双重定义会导致链接错误

Omk*_*ant 4

因为函数定义在链接时包含在可执行文件中,但声明或语法检查都在编译时完成

还要考虑一件事,当您调用任何函数并且编译器无法找到函数的声明时,它会生成警告为implicit declaration of func().

为了删除此警告消息,我们提供了 func 的前向声明,int func();并且编译时没有任何警告消息。

你认为为什么会发生这种情况?发生这种情况是因为编译器没有找到该func()符号。根据语言语法使代码没有错误完全取决于编译器。

但是最终可执行文件的构建是在链接时完成的,然后链接器开始寻找 的函数定义func(),如果找到则很好,如果没有..那么Linker error

could not have resolved external symbol _func()

注意:任何外部符号都会在链接时解析

在 gcc 上仅用于编译时使用此:(这可能根据编译器而有所不同)

gcc -Werror -c test.c --> 它将生成test.o文件

然后尝试链接它并使其可执行

gcc -Werror -o test test.o-->test可执行