
C语言程序编译成功了,为什么连接还出错
通过#include"d:\yueshu.c"调用文件yueshu.c,程序编译没有错,但是执行出错....
通过#include"d:\yueshu.c"调用文件yueshu.c,程序编译没有错,但是执行出错.
展开
展开全部
1 编译阶段,执行的是对单个文件的转换,从源代码转换成二进制文件。
2 链接阶段,将每个源文件转成的二进制文件,及相关的系统库文件共同打包生成可执行文件。
3 从定义上可以看出,链接阶段,出现错误有两种可能:
1) 函数中引用了不存在的函数。
2) 编译环境有问题,导致ld出错。
2 链接阶段,将每个源文件转成的二进制文件,及相关的系统库文件共同打包生成可执行文件。
3 从定义上可以看出,链接阶段,出现错误有两种可能:
1) 函数中引用了不存在的函数。
2) 编译环境有问题,导致ld出错。
展开全部
课本上学的,谢谢呀。
展开全部
有这种写法吗?
展开全部
C语言程序典型的全编译分为预处理、翻译、汇编、优化和链接这些部分,链接成功才产生最终目标(一般是可执行)文件,所以链接出错的话应该是不可能“执行”的,而是编译失败,LZ理解有误。
C语言中标识符必须先声明后使用,也包括函数。这样对于函数交叉引用的方面会带来问题,例如f()中调用g(),g()又递归调用了f(),这样没法确定定义的顺序了。所以需要有声明的存在(注意从效果上来说定义包含了声明),提示编译器在之后会有定义,不要把定义前用到的这个标识符当做没定义而产生编译错误并中断编译过程。当各个翻译单元(源文件)翻译过程完成后,链接器会查找没定义部分的符号链接然后处理之后输出最终目标文件。而文件包含就是直接复制文件内容替换到#include所在行,所以只含一般头文件的声明而没有定义,翻译成功的话,链接是没问题的(只要头文件声明的东西的定义能在其它编译单元或库文件内找到)。但是从LZ命名来看,包含的文件中包含了函数或变量的定义,这样对于每个包含过这个.c文件的翻译单元来说,翻译出的目标文件都含有这些定义,超过一个单元是这样的话,链接器就不知道要采用哪个目标文件中的对应定义版本了,因此链接出错。性质上来看,等于是重定义的编译错误拖延到链接器上发现而已。
解决方法是:包含的文件中只有声明没有定义,定义放在其它的编译单元。为了清楚起见,被包含的文件用.h作为扩展名,翻译单元用.c文件作为扩展名。
PS.每个翻译单元包含文件的过程是独立的。此外,多个翻译单元文件之间的翻译顺序是不确定的。这个是IDE的makefile工具的事,一般不用手动设置(设置起来非常麻烦),当然若是打算手动调用编译器和链接器的命令行就另当别论。
====
[原创回答团]
C语言中标识符必须先声明后使用,也包括函数。这样对于函数交叉引用的方面会带来问题,例如f()中调用g(),g()又递归调用了f(),这样没法确定定义的顺序了。所以需要有声明的存在(注意从效果上来说定义包含了声明),提示编译器在之后会有定义,不要把定义前用到的这个标识符当做没定义而产生编译错误并中断编译过程。当各个翻译单元(源文件)翻译过程完成后,链接器会查找没定义部分的符号链接然后处理之后输出最终目标文件。而文件包含就是直接复制文件内容替换到#include所在行,所以只含一般头文件的声明而没有定义,翻译成功的话,链接是没问题的(只要头文件声明的东西的定义能在其它编译单元或库文件内找到)。但是从LZ命名来看,包含的文件中包含了函数或变量的定义,这样对于每个包含过这个.c文件的翻译单元来说,翻译出的目标文件都含有这些定义,超过一个单元是这样的话,链接器就不知道要采用哪个目标文件中的对应定义版本了,因此链接出错。性质上来看,等于是重定义的编译错误拖延到链接器上发现而已。
解决方法是:包含的文件中只有声明没有定义,定义放在其它的编译单元。为了清楚起见,被包含的文件用.h作为扩展名,翻译单元用.c文件作为扩展名。
PS.每个翻译单元包含文件的过程是独立的。此外,多个翻译单元文件之间的翻译顺序是不确定的。这个是IDE的makefile工具的事,一般不用手动设置(设置起来非常麻烦),当然若是打算手动调用编译器和链接器的命令行就另当别论。
====
[原创回答团]
参考资料: 原创
本回答被网友采纳
展开全部
可能是系统找不到文件yueshu.c
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询