linux编译代码?linux嵌入式软件开发

各位老铁们,大家好,今天由我来为大家分享linux编译代码,以及linux嵌入式软件开发的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

linux 如何运行编译程序

gcc有多达100多个参数,现介绍常用的几个。如果对其他参数也有兴趣,可以参考:man gcc

预先处理选项

-E:只对文件进行预处理,输出结果到标准输出

-C:告诉预处理器不要丢弃注释.配合`-E‘选项使用.-P:告诉预处理器不要产生`#line'命令.配合`-E'选项使用.

-v:显示正在使用的gcc的版本

常用编译选项

-c:将源程序编译为目标代码但并不做链接的工作,不生成最终的可执行文件,只生成一个与源文件文件名相同的以.o为后缀的目标文件。

-S:将远程序编译为一个后缀为.s的汇编语言文件,不会生成可执行文件

-x:强制编译器用指定的语言编译器来编译某个源文件

gcc-x c++ test.c表示强制用C++编译器来编译c程序

-static:强制连接静态库,运行时不依赖动态库

-share:编译时尽量使用动态库

-o:指定生成的可执行文件名,如果没有该选项,如果生成可执行文件,默认文件名为a.out

编译路径选项

-i:指定特定头文件

gcc–c-i/home/zry/test.h test.c

-I<DIR>:依赖选项,指定头文件路径

Linux下大多数函数将头文件放在/usr/include目录下,如果需要指定其他路径,可以使用该选项

gcc–I/home/zry/include–c test.c添加/home/zry/include到查找路径

-L<DIR>:指定库文件搜素路径,用法同上

-l<库名>:指定特定库文件

gcc–lapp–c test.c

Linux的库文件有一个约定,即以lib开头,-lapp表示连接libapp.so库文件

目标生成选项

-shared:生成动态库

gcc–shared libtest.so-i/home/zry/test.h test.c

生成静态库需要ar命令,后面讲解

-fPIC:生成可用于动态库的位置独立代码。所有的内部寻址均通过全局偏移表完成。

-ansi:支持符合ANSI标准的C程序.

该选项就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字以及诸如unix和vax这些表明当前系统类型的预定义宏。

__asm__, __extension__, __inline__和__typeof__仍然有效

使用`-ansi'选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方使用这些名字的程序了.

fno-asm:此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。

-fno-strict-prototype:只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.而gcc无论是否使用这个参数,都将对没有带参数的函数,认为没有显式说明的类型

-fthis-is-varialble:就是向传统c++看齐,可以使用this当一般变量使用

-fcond-mismatch:允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型

-funsigned-char:

-fno-signed-char:

-fsigned-char:

-fno-unsigned-char:

这四个参数是对char类型进行设置,将char类型设置unsigned char(前两个参数)或者 signed char(后两个参数)

-imacros file:将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中

-Dmacro:相当于C语言中的#define macro

-Dmacro=defn:相当于C语言中的#define macro=defn

-Umacro:相当于C语言中的#undef macro

-undef:取消对任何非标准宏的定义

-M:生成文件关联的信息。包含目标文件所依赖的所有源代码

-MM:和M一样,但是它将忽略由#include<file>造成的依赖关系。

-MD:-M相同,但是输出将导入到.d的文件里面

-MMD:和-MM相同,但是输出将导入到.d的文件里面

警告选项

fsyntax-only:检查程序中的语法错误,但是不产生输出信息.

-w:禁止所有警告信息.

-Wno-import:禁止所有关于#import的警告信息.

-pedantic:打开完全遵从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.

-Werror:将所有警告转换为错误

Werror选项要求GCC将所有警告当作错误进行处理。

-Wall:显示所有警告信息

在linux里,c程序的编辑、编译、调试的详细步骤是什么

在linux下,一般的c程序开发流程为:

c程序的编辑:

一般情况下,简单的c程序编辑是通过vi文本编辑器进行的,语法格式和在windows下的编辑是一样的;

c程序的编译:

而编译则是对编辑好的c语言程序进行一个,预处理,编辑,汇编和链接的过程,一般格式为:编译器名-参数目标文件名源文件名;

一般工作在命令行模式;

c程序的调试:

调试阶段则是建立在c程序编译通过的情况下进行的,一般通过GDB调试进行,逐步排错和细节查看。

如何编译linux源代码

首先uname-r看一下你当前的linux内核版本

1、linux的源码是在/usr/src这个目录下,此目录有你电脑上各个版本的linux内核源代码,用uname-r命令可以查看你当前使用的是哪套内核,你把你下载的内核源码也保存到这个目录之下。

2、配置内核 make menuconfig,根据你的需要来进行选择,设置完保存之后会在当前目录下生成.config配置文件,以后的编译会根据这个来有选择的编译。

3、编译,依次执行make、make bzImage、make modules、make modules

4、安装,make install

5、.创建系统启动映像,到/boot目录下,执行 mkinitramfs-o initrd.img-2.6.36 2.6.36

6、修改启动项,因为你在启动的时候会出现多个内核供你选择,此事要选择你刚编译的那个版本,如果你的电脑没有等待时间,就会进入默认的,默认的那个取决于/boot/grub/grub.cfg文件的设置,找到if ["${linux_gfx_mode}"!="text" ]这行,他的第一个就是你默认启动的那个内核,如果你刚编译的内核是在下面,就把代表这个内核的几行代码移到第一位如:

menuentry'Ubuntu, with Linux 3.2.0-35-generic'--class ubuntu--class gnu-linux--class gnu--class os{

recordfail

gfxmode$linux_gfx_mode

insmod gzio

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)'

search--no-floppy--fs-uuid--set=root 9961c170-2566-41ac-8155-18f231c1bea5

linux/boot/vmlinuz-3.2.0-35-generic root=UUID=9961c170-2566-41ac-8155-18f231c1bea5 ro quiet splash$vt_handoff

initrd/boot/initrd.img-3.2.0-35-generic

}

当然你也可以修改 set default="0"来决定用哪个,看看你的内核在第几位,default就填几,不过我用过这种方法,貌似不好用。

重启过后你编译的内核源码就成功地运行了,如果出现问题,比如鼠标不能用,usb不识别等问题就好好查查你的make menuconfig这一步,改好后就万事ok了。

最后再用uname-r看看你的linux内核版本。是不是你刚下的那个呢!有没有成就感?

阅读剩余
THE END