精华内容
下载资源
问答
  • 编译成bai功文件,以hello.c为例: 先将源文件编du译成目标zhi文件:gcc - c hello.c。生成hello.o文件,dao再将目标文件编译成可执行文件:gcc -o hello hello.o 这样就生成了可执行文件,在./hello就可以...

    ubuntu16.04实现

    百度答客1:

    是编译成功后的文件,以hello.c为例:
    先将源文件编译成目标zhi文件:

    gcc - c hello.c
    

    这样就生成hello.o文件,再将目标文件编译成可执行文件:

    gcc -o hello hello.o
    

    这样就生成了可执行文件,在./hello就可以运行hello了。

    百度答客2:

    后缀名.o 就是object, 也就相当于windows下编译的obj文件, 俗称目标文件,该文件是指源代码经过编译程序产生的且能被cpu直接识别二进制代码。由编译器生成,具体的生成方法在不同的开发环境上是不同的.

    百度百科说:后缀名.o文件是对象文件里面包含的内容就是0,1这样的机器可执行的执令,当你程序要执行时还需要进行链接(link).
    连接程序之后再将这个文件与系统库文件连接就生成可执行文件,也就是把多个.o文件连接成一个可执行文件了。

    展开全文
  • 如果你不指定编译什么文件,gcc默认一步到位,直接生成可执行文件你可以试试以下几个参数-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他将生成.o的obj文件-S 只激活预处理...
    如果你不指定编译成什么文件,gcc默认一步到位,直接生成可执行文件
    你可以试试以下几个参数

    -c

    只激活预处理,编译,和汇编,也就是他只把程序做成obj文件

    例子用法:

    gcc -c hello.c

    他将生成.o的obj文件

    -S

    只激活预处理和编译,就是指把文件编译成为汇编代码。

    例子用法

    gcc -S hello.c

    他将生成.s的汇编代码,你可以用文本编辑器察看

    -E

    只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.

    例子用法:

    gcc -E hello.c > pianoapan.txt

    gcc -E hello.c | more

    -o

    指定目标名称,缺省的时候,gcc 编译出来的文件是a.out,

    例子用法

    gcc -o hello.out hello.c

    gcc -o hello.asm -S hello.c

    转载于:https://www.cnblogs.com/Stomach-ache/p/4435939.html

    展开全文
  • 打开这个选项,去工程下找相应的.i文件,就能看见宏展开到底是个什么了:) 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被...

    转载自:https://wenku.baidu.com/view/f20bca7701f69e3143329417.html?from=search ,如有冒犯,请联系删除。
    C中的预编译宏定义 注:在VC中,想看到宏展开后的代码,设置在项目->属性->C/C++->预处理器->生成预处理文件 打开这个选项后,去工程下找相应的.i文件,就能看见宏展开后到底是个什么了:) 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的”宏(macro)”进行处理.
    C初学者可能对预处理器没什么概念, 这是情有可原的: 一般的C编译器都将预处理, 汇编, 编译, 连接过程集成到一起了.编译预处理往往在后台运行. 在有的C编译器中, 这些过程统统由一个单独的程序来完成, 编译的不同阶段实现这些不同的功能.可以指定相应的命令选项来执行这些功能. 有的C编译器使用分别的程序来完成这些步骤. 可单独调用这些程序来完成. 在gcc中,进行编译预处理的程序被称为CPP, 它的可执行文件名为cpp.
    编译预处理命令的语法与C语言的语法是完全独立的. 比如: 你可以将一个宏扩展为与C语法格格不入的内容, 但该内容与后面的语句结合在一个若能生成合法的C语句, 也是可以正确编译的.
    (一) 预处理命令简介
    注意: 函数宏对参数类型是不敏感的, 你不必考虑将何种数据类型传递给宏. 那么, 如何构建对参数类型敏感的宏呢? 参考本章的第九部分, 关于”##”的介绍.
    关于定义宏的另外一些问题 (1) 宏可以被多次定义, 前提是这些定义必须是相同的. 这里的”相同”要求先后定义中空白符出现的位置相同, 但具体的空白符类型或数量可不同, 比如原先的空格可替换为多个其他类型的空白符: 可为tab, 注释… e.g.

    #define NULL 0
    #define NULL /* null pointer */ 0 ```
    上面的重定义是相同的, 但下面的重定义不同:

    define fun(x) x+1

    define fun(x) x + 1 或: #define fun(y) y+1 “`

    如果多次定义时, 再次定义的宏内容是不同的, gcc会给出”NAME redefined”警告信息.
    应该避免重新定义函数宏, 不管是在预处理命令中还是C语句中, 最好对某个对象只有单一的定义. 在gcc中, 若宏出现了重定义, gcc会给出警告.
    (2) 在gcc中, 可在命令行中指定对象宏的定义: e.g. $ gcc -Wall -DMAX=100 -o tmp tmp.c 相当于在tmp.c中添加” #define MAX 100”.
    那么, 如果原先tmp.c中含有MAX宏的定义, 那么再在gcc调用命令中使用-DMAX, 会出现什么情况呢?
    —若-DMAX=1, 则正确编译.
    —若-DMAX的值被指定为不为1的值, 那么gcc会给出MAX宏被重定义的警告, MAX的值仍为1.
    注意: 若在调用gcc的命令行中不显示地给出对象宏的值, 那么gcc赋予该宏默认值(1), 如: -DVAL == -DVAL=1
    (3) #define所定义的宏的作用域 宏在定义之后才生效, 若宏定义被#undef取消, 则#undef之后该宏无效. 并且字符串中的宏不会被识别 e.g.

    define ONE 1 sum = ONE + TWO /* sum = 1 + TWO */

    define TWO 2 sum = ONE + TWO /* sum = 1 + 2 */

    undef ONE sum = ONE + TWO /* sum = ONE + 2 */

    char c[] = “TWO” /* c[] = “TWO”, NOT “2”! */
    (4) 宏的替换可以是递归的, 所以可以嵌套定义宏. e.g.

    define ONE NUMBER_1

    define NUMBER_1 1

    int a = ONE /* a = 1 */ “`
    2, #undef

    undef用来取消宏定义, 它与#define对立:

    undef name 如够被取消的宏实际上没有被#define所定义, 针对它的#undef并不会产生错误. 当一个宏定义被取消后, 可以再度定义它.

    3, #if, #elif, #else, #endif

    if, #elif, #else, #endif用于条件编译:

    if 常量表达式1 语句…

    elif 常量表达式2 语句…

    elif 常量表达式3 语句… …

    else 语句…

    endif

    if和#else分别相当于C语句中的if, else. 它们根据常量表达式的值来判别是否执行后面的语句. #elif相当于C中的else-if. 使用这些条件编译命令可以方便地实现对源代码内容的控制. else之后不带常量表达式, 但若包含了常量表达式, gcc只是给出警告信息.

    使用它们可以提升代码的可移植性—针对不同的平台使用执行不同的语句. 也经常用于大段代码注释. e.g.

    if 0 { 一大段代码; }

    endif

    常量表达式可以是包含宏, 算术运算, 逻辑运算等等的合法C常量表达式, 如果常量表达式为一个未定义的宏, 那么它的值被视为0.

    if MACRO_NON_DEFINED == #if 0 在判断某个宏是否被定义时, 应当避免使用#if, 因为该宏的值可能就是被定义为0. 而应当使用下面介绍的#ifdef或#ifndef.

    注意: #if, #elif, #else之后的宏只能是对象宏. 如果name为名的宏未定义, 或者该宏是函数宏. 那么在gcc中使用”-Wundef”选项会显示宏未定义的警告信息.
    4, #ifdef, #ifndef, defined.

    ifdef, #ifndef, defined用来测试某个宏是否被定义

    ifdef name 或 #ifndef name

    它们经常用于避免头文件的重复引用:

    ifndef FILE_H

    define FILE_H

    include “file.h”

    endif

    defined(name): 若宏被定义,则返回1, 否则返回0. 它与#if, #elif, #else结合使用来判断宏是否被定义, 乍一看好像它显得多余, 因为已经有了#ifdef和#ifndef. defined用于在一条判断语句中声明多个判别条件:

    if defined(VAX) && defined(UNIX) && !defined(DEBUG)

    和#if, #elif, #else不同, #indef, #ifndef, defined测试的宏可以是对象宏, 也可以是函数宏. 在gcc中使用”-Wundef”选项不会显示宏未定义的警告信息.
    5, #include , #include_next

    include用于文件包含. 在#include 命令所在的行不能含有除注释和空白符之外的其他任何内容.

    include “headfile”

    include

    include 预处理标记 前面两种形式大家都很熟悉, “#include 预处理标记”中, 预处理标记会被预处理器进行替换, 替换的结果必须符合前两种形式中的某一种.

    实际上, 真正被添加的头文件并不一定就是#include中所指定的文件.

    include”headfile”包含的头文件当然是同一个文件,但#include 包包含的”系统头文件”可能是另外的文件. 但这不值得被注意.感兴趣的话可以查看宏扩展后到底引入了哪些系统头文件.

    关于#include “headfile”和#include 的区别以及如何在gcc中包含头文件的详细信息, 参考本blog的GCC笔记.
    相对于#include, 我们对#include_next不太熟悉.

    include_next仅用于特殊的场合.它被用于头文件中(#include既可用于头文件中, 又可用于.c文件中)来包含其他的头文件. 而且包含头文件的路径比较特殊:从当前头文件所在目录之后的目录来搜索头文件. 比如: 头文件的搜索路径一次为A,B,C,D,E.

    include_next所在的当前头文件位于B目录, 那么#include_next使得预处理器从C,D,E目录来搜索#include_next所指定的头文件.

    可参考cpp手册进一步了解#include_next
    6, 预定义宏 标准C中定义了一些对象宏, 这些宏的名称以”__”开头和结尾, 并且都是大写字符. 这些预定义宏可以被#undef, 也可以被重定义.
    下面列出一些标准C中常见的预定义对象宏(其中也包含gcc自己定义的一些预定义宏:
    LINE当前语句所在的行号, 以10进制整数标注.
    FILE当前源文件的文件名, 以字符串常量标注.
    DATE程序被编译的日期, 以”Mmm dd yyyy”格式的字符串标注.
    TIME程序被编译的时间, 以”hh:mm:ss”格式的字符串标注, 该时间由asctime返回.
    STDC如果当前编译器符合ISO标准, 那么该宏的值为1
    STDC_VERSION如果当前编译器符合C89, 那么它被定义为199409L, 如果符合C99, 那么被定义为199901L. 我用gcc, 如果不指定-std=c99, 其他情况都给出STDC_VERSION未定义的错误信息, 咋回事呢?
    STDC_HOSTED如果当前系统是”本地系统(hosted)”, 那么它被定义为1. 本地系统表示当前系统拥有完整的标准C库.
    gcc定义的预定义宏:
    OPTMIZE如果编译过程中使用了优化, 那么该宏被定义为1.
    OPTMIZE_SIZE同上, 但仅在优化是针对代码大小而非速度时才被定义为1.
    VERSION显示所用gcc的版本号. 可参考”GCC the complete reference”. 要想看到gcc所定义的所有预定义宏, 可以运行: $ cpp -dM /dev/null
    7, #line

    line用来修改LINEFILE. e.g.

    printf(“line: %d, file: %s\n”, LINE, FILE);

    line 100 “haha” printf(“line: %d, file: %s\n”, LINE, FILE); printf(“line: %d, file: %s\n”, LINE, FILE);

    显示: line: 34, file: 1.c line: 100, file: haha line: 101, file: haha
    8, #pragma, _Pragma

    pragma用编译器用来添加新的预处理功能或者显示一些编译信息. #pragma的格式是各编译器特定的, gcc的如下:

    pragma GCC name token(s)

    pragma之后有两个部分: GCC和特定的pragma name. 下面分别介绍gcc中常用的.

    (1) #pragma GCC dependency dependency测试当前文件(既该语句所在的程序代码)与指定文件(既#pragma语句最后列出的文件)的时间戳. 如果指定文件比当前文件新, 则给出警告信息. e.g. 在demo.c中给出这样一句:

    pragma GCC dependency “temp-file”

    然后在demo.c所在的目录新建一个更新的文件: touchtempfile,: gcc demo.c 会给出这样的警告信息: warning: current file is older than temp-file 如果当前文件比指定的文件新, 则不给出任何警告信息.
    还可以在在#pragma中给添加自定义的警告信息. e.g.

    pragma GCC dependency “temp-file” “demo.c needs to be updated!

    1.c:27:38: warning: extra tokens at end of #pragma directive
    1.c:27:38: warning: current file is older than temp-file
    注意: 后面新增的警告信息要用”“引用起来, 否则gcc将给出警告信息.
    (2) #pragma GCC poison token(s) 若源代码中出现了#pragma中给出的token(s), 则编译时显示警告信息. 它一般用于在调用你不想使用的函数时候给出出错信息. e.g.

    pragma GCC poison scanf scanf(“%d”, &a); warning: extra tokens at end of #pragma directive error: attempt to use poisoned “scanf”

    注意, 如果调用了poison中给出的标记, 那么编译器会给出的是出错信息. 关于第一条警告, 我还不知道怎么避免, 用”“将token(s)引用起来也不行.
    (3) #pragma GCC system_header 从#pragma GCC system_header直到文件结束之间的代码会被编译器视为系统头文件之中的代码. 系统头文件中的代码往往不能完全遵循C标准, 所以头文件之中的警告信息往往不显示. (除非用 #warning显式指明). (这条#pragma语句还没发现用什么大的用处)
    由于#pragma不能用于宏扩展, 所以gcc还提供了_Pragma: e.g.

    #define PRAGMA_DEP #pragma GCC dependency "temp-file" ```
    由于预处理之进行一次宏扩展, 采用上面的方法会在编译时引发错误, 要将#pragma语句定义成一个宏扩展, 应该使用下面的_Pragma语句:

    define PRAGMA_DEP _Pragma(“GCC dependency \”temp-file\”“) “`

    注意, ()中包含的”“引用之前引该加上\转义字符.
    9,
    #, ##

    和##用于对字符串的预处理操作, 所以他们也经常用于printf, puts之类的字符串显示函数中.

    用于在宏扩展之后将tokens转换为以tokens为内容的字符串常量.

    e.g.

    #define TEST(a,b) printf( #a "<" #b "=%d\n", (a)<(b)); ```
    注意: #只针对紧随其后的token有效!
    ##用于将它前后的两个token组合在一起转换成以这两个token为内容的字符串常量. 注意##前后必须要有token. e.g.

    define TYPE(type, n) type n “`

    之后调用: TYPE(int, a) = 1; TYPE(long, b) = 1999; 将被替换为: int a = 1; long b = 1999;
    (10) #warning, #error

    ifdef DEBUG

    define my_printf(…) fprintf(stderr, VA_ARGS)

    else

    define my_printf(…) printf(VA_ARGS)

    endif “`

    tokens中的VA_ARGS被替换为函数宏定义中的”…”可变参数列表.
    注意在使用#define时候的一些常见错误:

    define MAX = 100

    define MAX 100;

    =, ; 的使用要值得注意. 再就是调用函数宏是要注意, 不要多给出”;”.

    展开全文
  • 从c模拟和bash模拟中,您可以推断出与解释型语言相比,编译后的语言可以在蒙特卡洛模拟中模拟更多点。 运行约7000点后,解释的语言将超时。 解释的语言必须在运行时翻译为机器指令,而编译语言可以直接从计算机的...
  • bin文件转换为hex文件C语言实现

    万次阅读 2015-04-19 19:25:22
    对于嵌入式而言,hex文件可能大家再熟悉不过了,对,我们大学时学习的51单片机编写的代码在keil上编译后生成了hex文件。那bin文件又是什么意思呢,它又和hex文件的区别在哪?这也不是本文的重点,下面简单的描述下...

    对于嵌入式而言,hex文件可能大家再熟悉不过了,对,我们大学时学习的51单片机编写的代码在keil上编译后就生成了hex文件。那bin文件又是什么意思呢,它又和hex文件的区别在哪?这也不是本文的重点,下面简单的描述下:

    最通俗的来讲,hex是带地址的,用下载器下载时,不需要设置偏移地址,它是文件流格式的,都是标准的ASCII码。而bin文件是不带地址的,全部是二进制数据流,打住一下,其实就是我们所谓的机器代码。有兴趣的同学,可以尝试着用反汇编,得到的就是汇编代码了。我所用的开发板S3C2440在ADS1.2上编译形成的代码就是bin格式流,用j-flash打开文件的时候就需要填入偏移地址,三星平台flash偏移地址为0,而stm32平台flash偏移地址就是0x08000000.

    本来是应该要描述下hex文件的数据格式,这个就留着下一篇文章来描述,其实百度上也有很多。下一张是hex文件转换为bin文件,刚好和本文相反。说了这么多,下面就直接贴出代码了,有不详细的可以给我留言,同时也欢迎大家喷我。

    代码是在VC6.0上面实现的:

    首先新建bin2hex.h文件

    #ifndef BIN2HEX_H
    #define BIN2HEX_H
    typedef unsigned char uint8_t;
    typedef unsigned short uint16_t;
    typedef unsigned long uint32_t;
    /***********************************
    *********************************************
    就是每次读写bin文件N个字节,然后再转化为hex格式流,hex格式流长度计算方式
    : + 长度 + 地址 + 类型 + N个数据(N >= 0) + 校验
    1 + 2	 + 4	+ 2	   + N * 2			 + 2
    ********************************************************************************/
    #define NUMBER_OF_ONE_LINE		0x20
    #define	MAX_BUFFER_OF_ONE_LINE	(NUMBER_OF_ONE_LINE * 2 + 11) 
    typedef struct {
    	uint8_t len;
    	uint8_t addr[2];
    	uint8_t type;
    	uint8_t *data;
    } HexFormat;
    
    typedef enum {
    	RES_OK = 0,						//操作完成
    	RES_BIN_FILE_NOT_EXIST,			//相当于bin文件不存在,包括输入的路径可能存在不正确
    	RES_HEX_FILE_PATH_ERROR			//目标文件路径可能输入有误			
    } RESULT_STATUS;
    
    RESULT_STATUS BinFile2HexFile(char *src, char *dest);
    #endif

    新建bin2hex.c 文件

    #include "bin2hex.h"
    #include <stdio.h>
    /********************************************************************************
    input:
    	dest: 为转换后的结果
    	p->addr[0]: 高地址
    	p->addr[1]: 低地址
    	p->type: 记录类型
    	p->data: 为bin格式流有效数据指针
    	p->len: 为bin格式流有效数据长度
    output:
    	返回有效数据的长度
    ********************************************************************************/
    uint16_t BinFormatEncode(uint8_t *dest, HexFormat *p)
    {
    	uint16_t offset = 0;
    	uint8_t check = 0, num = 0;		//:(1) + 长度(2) + 地址(4) + 类型(2)
    	sprintf(&dest[offset], ":%02X%02X%02X%02X", p->len, p->addr[0], p->addr[1], p->type);
    	offset += 9;					//hex格式流数据指针偏移2
    	check = p->len + p->addr[0] + p->addr[1] + p->type;	//计算校验和
    	while (num < p->len)			//当数据长度不为0,继续在之前的hex格式流添加数据
    	{								
    		sprintf(&dest[offset], "%02X", p->data[num]);
    		check += p->data[num];		//计算校验和
    		offset += 2;				//hex格式数据流数据指针偏移2
    		num++;						//下一个字符
    	}
    	check = ~check + 1;				//反码+1
    	sprintf(&dest[offset], "%02X", check);
    	offset += 2;		
    	return offset;					//返回hex格式数据流的长度
    }
    
    RESULT_STATUS BinFile2HexFile(char *src, char *dest)
    {
    	FILE *src_file, *dest_file;
    	uint16_t tmp;
    	HexFormat gHexFor;
    	uint32_t low_addr = 0, hign_addr = 0;
    	uint8_t buffer_bin[NUMBER_OF_ONE_LINE], buffer_hex[MAX_BUFFER_OF_ONE_LINE];
    	uint32_t src_file_length;
    	uint16_t src_file_quotient, cur_file_page = 0;
    	uint8_t src_file_remainder;
    	src_file = fopen(src, "rb");		//源文件为bin文件,以二进制的形式打开
    	if (!src_file)						//这里也是相当于用来检查用户的输入是否准备
    	{
    		return RES_BIN_FILE_NOT_EXIST;
    	}
    	dest_file = fopen(dest, "w");		//目的文件为hex文件,以文本的形式打开
    	if (!dest_file)						
    	{
    		return RES_HEX_FILE_PATH_ERROR;
    	}
    	fseek(src_file, 0, SEEK_END);		//定位到文件末 
    	src_file_length = ftell(src_file);
    	fseek(src_file, 0, SEEK_SET);		//重新定位到开头,准备开始读取数据
    	src_file_quotient = (uint16_t)(src_file_length / NUMBER_OF_ONE_LINE);	//商,需要读取多少次
    	src_file_remainder = (uint8_t)(src_file_length % NUMBER_OF_ONE_LINE);	//余数,最后一次需要多少个字符
    	gHexFor.data = buffer_bin;			//指向需要转换的bin数据流
    	while (cur_file_page < src_file_quotient)
    	{
    		fread(buffer_bin, 1, NUMBER_OF_ONE_LINE, src_file);
    		gHexFor.len = NUMBER_OF_ONE_LINE;
    		if ((low_addr & 0xffff0000) != hign_addr && hign_addr != 0)		//只有大于64K以后才写入扩展线性地址,第一次一般是没有
    		{
    			hign_addr = low_addr & 0xffff0000;							
    			gHexFor.addr[0] = (uint8_t)((hign_addr & 0xff000000) >> 24);
    			gHexFor.addr[1] = (uint8_t)((hign_addr & 0xff0000) >> 16);
    			gHexFor.type = 4;										
    			gHexFor.len = 0;											//记录扩展地址			
    			tmp = BinFormatEncode(buffer_hex, &gHexFor);
    			fwrite(buffer_hex, 1, tmp, dest_file);
    			fprintf(dest_file, "\n"); ;
    		}
    		gHexFor.addr[0] = (uint8_t)((low_addr & 0xff00) >> 8);
    		gHexFor.addr[1] = (uint8_t)(low_addr & 0xff);
    		gHexFor.type = 0;												//数据记录
    		tmp = BinFormatEncode(buffer_hex, &gHexFor);
    		fwrite(buffer_hex, 1, tmp, dest_file);
    		fprintf(dest_file, "\n"); ;
    		cur_file_page++;
    		low_addr += NUMBER_OF_ONE_LINE; 
    	}
    	if (src_file_remainder != 0)		//最后一次读取的个数不为0,这继续读取
    	{
    		fread(buffer_bin, 1, src_file_remainder, src_file);
    		gHexFor.addr[0] = (uint8_t)((low_addr & 0xff00) >> 8);
    		gHexFor.addr[1] = (uint8_t)(low_addr & 0x00ff);
    		gHexFor.len = src_file_remainder;
    		gHexFor.type = 0;												//数据记录						
    		tmp = BinFormatEncode(buffer_hex, &gHexFor);
    		fwrite(buffer_hex, 1, tmp, dest_file);
    		fprintf(dest_file, "\n"); ;
    	}
    	gHexFor.addr[0] = 0;				
    	gHexFor.addr[1] = 0;
    	gHexFor.type = 1;					//结束符
    	gHexFor.len = 0;
    	tmp = BinFormatEncode(buffer_hex, &gHexFor);
    	fwrite(buffer_hex, 1, tmp, dest_file);
    	fprintf(dest_file, "\n"); ;
    	fclose(src_file);
    	fclose(dest_file);
    	return RES_OK;
    }

    新建main.c文件,这里是带参数的,主要是方便批处理,是另有用途。

    #include <stdio.h>
    #include "bin2hex.h"
    int main(int argc, char *argv[])
    {
    	RESULT_STATUS res;
    	if (argc != 3)
    	{
    		printf("input para doesn't match\r\n");
    		return -1;
    	}
    	res = BinFile2HexFile(argv[1], argv[2]);
    	switch (res)
    	{
    		case RES_OK:
    			printf("hex file to bin file success!\r\n");
    			return -1;
    		case RES_BIN_FILE_NOT_EXIST:
    			printf("bin file doesn't exist!\r\n");
    			return -1;
    		case RES_HEX_FILE_PATH_ERROR:
    			printf("hex file path is error, please check it!\r\n");
    			return -1;
    	}
    	return 0;
    }

    三个源文件,编译生成bin2hex.c文件。

    下面描述下用法:

    把bin2hex.c文件拷贝到c盘根目录下,再拷贝一个需要转换的bin文件,这里我就拷贝了一个hwb.bin文件。然后点击菜单开始->运行->输入cmd->进入dos窗口->调整当前目录为c:,这个如果不知道的可以百度一下,无法就是就是命令cd.

    最后输入命令:bin2hex hwb.bin hwb.hex,输入后,可以看到提示说转换成功,大家再检查下是否有一个hex文件,本文的代码支持大于64K,大家把转换后的hex下载到单片机上运行试试看。

    展开全文
  • C语言程序在编译完成,初始化为非零的全局变量存放在.data段,而未初始化或初始化为0的全局变量存放在.bss段中。 在生成的可执行文件中,只有.data段和.text段(存放代码),由系统从可执行文件中加载 .bss段在可...
  • 编译后生成可执shu行文件,可以在执行的程序后加参数,比如编译一个程序为test.exe,则在执行时可以输入: test.exe 1 firestone 在这里,argc等于3,argv[0]为"test.exe",argv[1]为"1",argv[2]为"firestone"。 ...
  • C和C++的函数符号生成...C++调用C语言,由于符号的生成规则不同会导致符号解析出错。使用extern C告诉C++编译器用C语言的规则生成符号。 例:extern "C" {int sum(int a,int b);}//调用.c文件中的sum函数...
  • 在开始讲解之前,我先科普一下知识,平时我们编译.c文件是,一般分为三个步骤: 第一步生成汇编代码 第二部生成目标文件 第三步生成可执行文件 [test@localhost Assembler]$ gcc -S main.c [test
  • C语言执行机制

    2020-09-04 11:09:28
    使用C语言的7个步骤 定义程序的目标: 思考你的程序需要哪些信息,要进行哪些计算和控制,以及程序应该要报告什么信息。...②检查C语言程序是否有效,若编译器发现错误,就不生成可执行文件并报错。 运行程序:
  • C语言编程要点

    2017-09-18 00:10:37
    目 录 第1章 C语言 8 1.1 什么是局部程序块(local block)? 8 1.2 可以把变量保存在局部程序块中吗? 9 1.3 什么时候用一条switch语句比用多条if语句更好? 9 1.4 switch语句必须...18.5. 怎样生成一个“.COM”文件...
  • 程序员C语言快速上手——工程篇(十二)

    千次阅读 多人点赞 2019-08-08 22:08:10
    文章目录链接与库前言虚拟内存理解链接C程序编译的四个阶段预处理器编译器汇编器链接器小结什么是链接查看符号表*拓展:nm命令查看符号类型静态链接与动态链接函数库静态库打包静态库链接静态库动态库生成与位置无关...
  • 用 C 语言编写的源程序须经过编译连接生成扩展名为 .exe 的可执行文件,才能运行。() A 正确 B 错误 答案: B C语言编写的程序,肯定是要经过一系列的编译,链接,生成可执行的文件。 在windows系统中,...
  • 书山有路勤为径 学海无涯苦作舟 一思考题 1你如何向别人解释清楚什么是编程什么是计算机语言 2什么C语言 二解答题 1用C语言编写程序求任意两个整数的和...} 3C语言源程序文件名的后缀为经过编译后生成文件的后缀为
  • 思考个问题,为什么汇编没有链接的点o文件不能执行? 当我们写好一个helloword的程序,然后用gcc去编译这个helloworld程序,这个过程到底发生了什么事情? 预编译,处理c语言的一些编译器关键字。 编译,从人类...
  • 1,什么C语言;  1.1面向过程编程的高级语言;...编译后生成.exe可执行文件; 2,数据类型;  2.1基本类型:整型,浮点型,字符型;  int:32位编译器4字节,64位编译器8字节;  short int :比int的短...
  • 我们在写完代码需要对代码进行编译和执行,点完按钮编译器就自动生成了结果,难道小伙伴们不好奇编译执行过程中发生了什么事情吗?今天就来写一下程序环境和预处理。 C语言程序环境 翻译环境和执行环境 ...
  • 最简单的C语言程序

    2014-10-27 18:15:44
    声明:本人知识有限,文章可能有误或不全面,望指正并讨论!最简单的C语言程序,应该就是一个...}在 unix/linux下编译后生成可执行程序main,并执行main:#cc-Wall-omainmain.c #./main #程序无输出。这是一个最...
  • 解释则是只在执行程序时,将源程序一行一行地解析成目标程序以便给计算机执行,运行速度不如编译后运行快,但占空间较小。 使用编译的语言举例: C语言、C++、Pascal、Golang 它们都是将程序编译为exe可执行文件,...
  • Gcc编译

    2021-03-30 11:27:20
    文章目录 前言 一、pandas是什么? 二、使用步骤 1.... 2....gcc可以编译C、C++、JAVA......一、GCC是什么?... 预处理的.i文件编译成为汇编语言,生成.s文件。 将汇编语言文件经过汇编,生成目标.
  • 上一篇文章学了堆,栈...将源代码编译后,会生成可执行文件程序(Linux下是.out,windows下是.exe)。这个文件就是程序。也叫作可执行代码。 比如下面的源代码对应的可执行文件的内容: 那么程序文件中,各个段的...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 声明问题 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 *1.26 main的正确定义是什么...
  • 七、交叉编译

    2020-12-21 21:23:50
    文章目录综述:编译链接编译、本地编译、交叉编译的概念为什么要交叉编译? 综述: ...  把经过编译后生成的目标文件,按照其内在引用关系彼此相连接而生成一个完整的、可执行的文件的过程称为链
  • 新手写了一个文件后尝试编译,结果无法生成相应编译文件![图片说明](https://img-ask.csdn.net/upload/202002/06/1580957684_335810.png) 请问有可能是什么原因? 下完gcc又出现了![图片说明]...
  • 自己在博客中写了由几个文件构成的代码,最后生成了一个静态库叫做libsum.a,里面保存着几个供main() 函数调用的函数,自己最后再把这个库和mian.c文件一起编译。可是makefile中一直报错 (具体的错误在博客最后面...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 142
精华内容 56
关键字:

c语言编译后生成什么文件

c语言 订阅