mimidodo 发表于 2014-10-2 08:03:36

关于gcc编译器不生成hex问题

昨天写了个12864的程序,用的codeblocks,gcc编译器,但编译完了没有生成hex文件,而是生成了map文件,我又把这个工程关了,重新建立一个测试工程(只有主函数的最简单的程序),编译完了生成了hex文件,所以证明了不是编译器的问题,我还是第一次遇到这样的问题。以前也没见过map文件,我把那个不能生成hex文件的工程中的除了主函数的其他都注释掉了,编译后也没有生成hex,路径和文件名没有中文和空格,请问map文件是什么呢,为什么不能生成hex文件呢?

semilog 发表于 2014-10-2 11:48:30

看看你的工程配置有没有什么不对的地方。有空看看编译的Makefile文件,了解一下编译器如何工作的,或许更有帮助

semilog 发表于 2014-10-2 11:55:59

对了,map文件是编译生成的对编译的映像文件的描述,各个输入输出段的位置等等,了解一下elf文件的结构,就会明白很多

laylovesb1314 发表于 2014-10-3 01:40:26

z中文目录的原因吧:

laylovesb1314 发表于 2014-10-3 01:41:25

z中文目录的原因吧:

笑笑我笑了 发表于 2014-10-3 09:18:03

用objcopy把elf文件转成hex或者bin文件。例如:
$(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin

其中$(OBJCOPY)是objcopy的名字,比如avr-objcopy
      $(PROJ_NAME)是生成文件的名字。

dsp56789 发表于 2014-10-3 10:02:15

配置的问题

dawanpi 发表于 2014-10-3 10:15:01

6楼正解,ihex生成hex文件,binary生成bin文件:
$(OBJCOPY) -O ihex $(TARGET).elf $(TARGET).hex

mimidodo 发表于 2014-10-4 09:24:35

semilog 发表于 2014-10-2 11:55
对了,map文件是编译生成的对编译的映像文件的描述,各个输入输出段的位置等等,了解一下elf文件的结构,就 ...

map文件要用什么打开呢?

mimidodo 发表于 2014-10-4 09:26:12

laylovesb1314 发表于 2014-10-3 01:41
z中文目录的原因吧:

绝对没有中文路径的,我故意试了一下中文路径,或者带空格的路径,编译完什么文件都不会生成

mimidodo 发表于 2014-10-4 09:31:08

笑笑我笑了 发表于 2014-10-3 09:18
用objcopy把elf文件转成hex或者bin文件。例如:




elf文件都没有啊,debug文件夹里只有一个map文件,而且还很大,有27kb,你能帮我解决一下么,先谢谢啦,这个问题困扰我好多天了,我把工程传一下

mimidodo 发表于 2014-10-4 09:32:51

mimidodo 发表于 2014-10-4 09:31
elf文件都没有啊,debug文件夹里只有一个map文件,而且还很大,有27kb,你能帮我解决一下么,先谢谢啦, ...

只生成map的工程

笑笑我笑了 发表于 2014-10-5 10:21:51

mimidodo 发表于 2014-10-4 09:32
只生成map的工程

这个传上来没用啊,建议检查下工程配置,或者自己手动编译试下。

semilog 发表于 2014-10-6 00:05:57

本帖最后由 semilog 于 2014-10-6 00:11 编辑

mimidodo 发表于 2014-10-4 09:32
只生成map的工程

你的工程帮你验证了,找出了你出错的原因,注意看,如下:


其实工程配置并没有问题,而是你犯了变量重复定义的错,上图:

出错的原因,是因为全局变量定义后,你在LCD128X64_V3.c中用了#include"Font_code.c",在main.c又用了#include "LCD128X64_V3.C"这样直接导到在main.c和LCD128X64_V3.c
两个文件都定义了一次Font_code[], 导至了编译器在链接的时候发现变量重复定义,从而出错,无法生成 elf文件,只是这里avr-gcc编译器,没有显示error字样,
所以你没有发现

你可能要问,为何编译没有出错,且.o目标文件也都生成,为何还会出错?   

这是因为每个文件都是分开编译的,分开时都没有出错,是因为一个文件中只定义了一次,但是链接时是把所有的符号表都放在一起的,所以会出现重复的全局变量名,

从而导致出错

找到原因,解决办法就变得简单了:把#include"Font_code.c" 这一行改成extern unsigned charFont_code[];
就可了。

这里再次说一下,你的代码这样写很不规范,如果用include 引用.c源文件,则被引用.c文件无须加入工程,且只能被一个.c文件引用,其他文件要引用这个变量,用 extern,
而且我们通常做法不是直接把整个变量定义写入一个.c文件,而是只写数据,如下:

建 font.txt文件:内容如下:

{0x00,0x00,0x00,0x00,0x00,0x00},// (0)
{0x00,0x00,0x00,0x4F,0x00,0x00},//
{0x00,0x00,0x07,0x00,0x07,0x00},//"(2)
{0x00,0x14,0x7F,0x14,0x7F,0x14},//#(3)
........
{0x00,0x1C,0x2A,0x32,0x2A,0x1C},//笑面(131)
{0x00,0x1C,0x22,0x44,0x22,0x1C}

然后在.c文件中写成这样:
unsigned charFont_code[] = {
include "font.txt"
};

这是一般的做法,这样,就可以在.c中看到文件名,而又不用关心.txt文件中的内容了。linux中的固件驱动,很多都是这样弄的。

想告诉你的是,你的程序中有很多不规范的地方,所有的警告你都要看一下,并尽量改掉,去掉警告,说不定哪天,你程序的行为出错,就是因为警告产生的,
而且是偶现的。

好吧,有点啰嗦了,祝好运~~

mimidodo 发表于 2014-10-8 20:14:51

semilog 发表于 2014-10-6 00:05
你的工程帮你验证了,找出了你出错的原因,注意看,如下:




多谢啦,解决了,我要自己不知道什么时候能解决呢,您说得对,我编程方面有很多不规范,很多警告没有去理会,马马虎虎才导致了这样的错误,
页: [1]
查看完整版本: 关于gcc编译器不生成hex问题