当前位置:文档之家› gcc的几个妙用

gcc的几个妙用

gcc的几个妙用
gcc的几个妙用

gcc的几个妙用

gcc的学习在C接触到linux以后就开始不断的学习,

也知道了一些基本的用法,但是关于gcc的使用还是有

很多值得我们加深的地方。gcc 只是一个编译工具而已。也就相当于我们在windows环境下的visual c++等一样,区别是visual c++是基于IDE的,而gcc是这些IDE的

基础。学习linux程序设计必然会学习gcc。

gcc实质是完成程序的编译和链接,程序的编译是指从

一种文件类型转换到另一种文件类型的过程。一个C语

言程序转换为可执行程序的基本步骤如下:

1、编写程序(vi,emacs等软件)

2、程序预编译(cpp)

3、编译成汇编程序(cc)

4、汇编程序(as)

5、链接程序(ld)

其中的这些过程都已经被gcc包含,我们在实际的编译

过程中采用了gcc main.c -o main.exe即可实现一个程序的编译和链接。并不需要一步一步的实现,但是我们

在分析的过程中又必须注意一个C语言文件的处理过程

以及相应的处理程序。

关于gcc的基本含义用法就不再详细的说明了,我觉得

最简单的使用方法是通过软件的help学习软件。

[gong@Gong-Computer test]$ gcc --help

Usage: gcc [options] file...

Options:

-pass-exit-codes

Exit with highest error code from a phase

--help

Display this information

--target-help

Display target specific command line options

--help={target|optimizers|warnings|params|[^]{joi ned|separate|undocumented}}[,...]

Display specific types of command line options (Use '-v --help' to display command line options of sub-processes)

--version

Display compiler version information

-dumpspecs

Display all of the built in spec strings

-dumpversion

Display the version of the compiler

-dumpmachine

Display the compiler's target processor

-print-search-dirs

Display the directories in the compiler's search path

-print-libgcc-file-name Display the name of the compiler's companion library

-print-file-name=;

Display the full path to library ;

-print-prog-name=; Display the full path to compiler component ;

-print-multi-directory

Display the root directory for versions of libgcc

-print-multi-lib

Display the mapping between command line options and

multiple library search directories

-print-multi-os-directory Display the relative path to OS libraries

-print-sysroot

Display the target libraries directory

-print-sysroot-headers-suffix Display the sysroot suffix used to find headers

-Wa,;

Pass comma-separated ; on to the assembler

-Wp,;

Pass comma-separated ; on to the preprocessor -Wl,;

Pass comma-separated ; on to the linker

-Xassembler ;

Pass ; on to the assembler

-Xpreprocessor ;

Pass ; on to the preprocessor

-Xlinker ;

Pass ; on to the linker

-combine

Pass multiple source files to compiler at once -save-temps

Do not delete intermediate files

-save-temps=;

Do not delete intermediate files

-no-canonical-prefixes

Do not canonicalize paths when building relative

prefixes to other gcc components

-pipe

Use pipes rather than intermediate files

-time

Time the execution of each subprocess

-specs=;

Override built-in specs with the contents of ; -std=;

Assume that the input sources are for ;

--sysroot=;

Use ; as the root directory for headers

and libraries

-B ;

Add ; to the compiler's search paths

-b ;

Run gcc for target ;, if installed

-V ;

Run gcc version number ;, if installed

-v

Display the programs invoked by the compiler -###

Like -v but options quoted and commands not executed

-E

Preprocess only; do not compile, assemble or link

-S

Compile only; do not assemble or link

-c

Compile and assemble, but do not link

-o ;

Place the output into ;

-x ;

Specify the language of the following input files

Permissible languages include: c c++ assembler none

'none' means revert to the default behavior of

guessing the language based on the file's extension

Options starting with -g, -f, -m, -O, -W, or --param are automatically

passed on to the various sub-processes invoked by gcc. In order to pass

other options on to these processes the -W; options must be used.

For bug reporting instructions, please see:

;.

从上面的结果可以知道基本的用法。

但是还是有几个需要注意的地方,这也是我们学习gcc

时不经常使用,但又非常有用的几个用法。

1、采用gcc实现预编译,预编译可以实现代码的检查,特别是宏定义的检查,通过预编译检查实际的代码是否

出错,这是非常有用的检查方式。

由于预编译以后宏定义被扩展了,这时对源码的分析就

能找出代码宏定义等是否存在错误,特别时一些不容易

发现的错误。

基本的实现形式为:gcc -E file.c >; file.pre.c

[gong@Gong-Computer Example]$ vi main.c

采用重定向的方式改变输出流,便于检查错误所在。[gong@Gong-Computer Example]$ gcc -E main.c >; main.pre.c

[gong@Gong-Computer Example]$ vi main.pre.c

从上面的结果可以发现我们的宏已经实现了扩展。通过分析宏的扩展可以分析代码是否正确。

比如我将宏定义max(x,y)改写为max (x,y)就会出现下面的结果。如下图所示。

从856行的结果我们可以知道,上面的代码并不是我们需要的情况,这说明我们的代码存在问题,从而实现了宏定义的检测。这是非常有用的一种检测方式。

2、产生镜像文件

基本的实现方法是:注意Wl逗号后面跟着需要传递的参数,逗号后面不能存在空格,否则出现错误。

gcc -Wl,-Map=file.map file.c -o target

关于选项-Wl的使用可以参考help,这是我的一个截图

从上面说明可以知道-Wl用于传递参数给链接器。当然也有传递给汇编器和预编译的选项。

通过上面的选项可以得到一个镜像文件,通过打开镜像文件来程序的结构。

[gong@Gong-Computer Example]$ gcc

-Wl,-Map=main.map main.c -o main.exe

[gong@Gong-Computer Example]$ vi main.map

上面只是其中的一部分,还有很多的内容。其中这些内

容指出了程序的基本分布情况。

3、汇编程序

汇编语言是不可避免要学习的设计语言,但是很多时候

并不需要完全手动的编写汇编语言,我们可以采用gcc

实现一段程序的汇编形式,只需要选择正确的选项即可。gcc -S file.c

实现如下:

[gong@Gong-Computer Example]$ gcc -S main.c [gong@Gong-Computer Example]$ vi main.s

从上面的代码就知道了基本的汇编形式,当然也可以自

己设计,但是该选项简化了汇编语言的设计。

4、在gcc中函数库,链接库的调用,这是比较难以掌握

和容易出错的地方。

在静态编译的情况下:

gcc file.c -o file -Llibpath -llibname

gcc中-L主要是指明函数库的查找目录,-L后紧跟着目录而不是文件。-l后面紧跟着需要连接的库名,需要主要的是静态库通常是以 libfile.a命名,这时-l后的库名只能是file,而不是libfile.a。这是需要注意的。一般情况下总是将-l放在最后。但是需要注意的是各个库之间的依赖关系。依赖关系没有搞清楚也会导致编译出现错误。

下面的代码如下:

foo.c

1 #include;

2

3

4 extern void bar();

5

6 void foo()

7 {

8 printf("This is foo ().\n");

9

10 bar ();

11 }

bar.c

1 #include;

2

3 void bar()

4 {

5

printf( " This is bar (). \n");

6 }

7

main.c

1 extern void foo();

2

3 int main()

4 {

5

foo();

6

7

return 0;

8 }

~

简要的介绍一些静态库的创建方式。

首先需要注意的时静态编译是指将一些库函数编译到程序中,这样会增加程序的大小。动态库则是在运行过程中添加到程序中,这样可以减小程序的大小。两种方式都有各自的优势。

静态库的创建:

gcc -c foo.c -o foo.o

gcc -c bar.c -o bar.o

创建的基本过程就是采用归档函数实现。

ar csr libfoo.a foo.o

ar csr libbar.a bar.o

从上面的程序我们可以知道foo程序依赖bar程序,而main程序则依赖foo程序,所以这样就形成了一定的关系,一般来说只有将依赖的库函数写在最右边才能保证其他的库函数依赖该库函数。

[gong@Gong-Computer test]$ gcc -o main main.c -L. -lbar -lfoo

./libfoo.a(foo.o): In function `foo':

foo.c:(.text+0x13): undefined reference to `bar' collect2: ld returned 1 exit status

[gong@Gong-Computer test]$ gcc -o main main.c -L. -lfoo -lbar

以上的两个编译过程只是存在一个差异就是库的摆放顺序存在差别,第一种情况下由于foo依赖bar,而bar库不能被foo调用,因此出错。而第二种则满足foo依赖bar,main依赖foo的关系。其中的-L.表示库函数的搜索目录为当前目录。也可以换成其他的目录。

因此在gcc中添加库时,需要注意库名和库的顺序,最好采用一定的依赖关系图分析实现。具体的就要我们在设计程序时自己的考虑各个库函数之间的关系。

至于动态库的创建可以采用gcc实现。其中的-shared就是表明了该库是动态库,-fPCI是指支持PCI,file.o是指需要加载到库中的二进制文件。库名就是libname.so gcc -shared -fPCI -o libname.so file.o

动态库的使用可以将创建好的动态库放在/usr/lib下,然后在函数中即可实现调用。

gcc的其他一些用法:

查找系统文件路径:gcc -v main.c

获得程序的依赖关系:gcc -M main.c ,其中包括了所有的依赖关系,在写makefile过程中写依赖关系通常不需

要系统头文件,这时可以采用gcc -MM main.c去掉系统头文件的依赖关系。

[gong@Gong-Computer test]$ gcc -M main.c

main.o: main.c /usr/include/stdio.h

/usr/include/features.h \

/usr/include/sys/cdefs.h

/usr/include/bits/wordsize.h \

/usr/include/gnu/stubs.h

/usr/include/gnu/stubs-32.h \

/usr/lib/gcc/i686-redhat-linux/4.5.1/include/stdd ef.h \

/usr/include/bits/types.h

/usr/include/bits/typesizes.h \

/usr/include/libio.h /usr/include/_G_config.h

/usr/include/wchar.h \

/usr/lib/gcc/i686-redhat-linux/4.5.1/include/stda rg.h \

/usr/include/bits/stdio_lim.h

/usr/include/bits/sys_errlist.h

[gong@Gong-Computer test]$ gcc -MM main.c

main.o: main.c

[gong@Gong-Computer test]$

从上面的两个结果就可以知道两个选项的差别,这种差别在编写Makefile中的依赖关系时非常的有用。特别是第二种形式是比较重要的方式。

关于gcc的使用还是要多实践才有效果,才能准确的运用。

Linu系统编程实验二gccgdb的使用以及Makefile文件的编写

实验二:gcc、gdb、Makefile的使用 实验目的: (一)学会使用gcc编译器 (二)学会gdb调试器的使用 (三)学会编写Makefile 实验要求: (一)编写一应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-O2等选项(二)编写一应用程序,使用gdb调试,调试中使用到该小节所介绍的所有命令 (三)实现一应用程序,该程序有两个c文件构成,使用makefile来完成对该程序的编译实验器材: 软件:安装了Linux的vmware虚拟机 硬件:PC机一台 实验步骤: (一)gcc编译器 1、先用vi编辑文件,内容如下: 2、gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件] 例:使用gcc编译命令,编译生成可执行文件hello,并运行hello 上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、连接一步完成,下面将介绍四个流程分别做了什么工作 3、-E选项的作用:只进行预处理,不做其他处理。 例:只对文件进行预处理,生成文件,并查看 通过查看可以看到头文件包含部分代码#include <>经过预处理阶段之后,编译器已将的内容贴了进来。 4、-S选项的使用 -S选项的作用:只是编译不汇编,生成汇编代码

例:将文件只进行编译而不进行汇编,生成汇编代码 5、-c选项的使用 -c选项的作用:只是编译不连接,生成目标文件.o 例:将汇编代码只编译不链接成文件 6、将编译好的链接库,生成可执行文件hello 7、-static选项的使用 -static选项的作用:链接静态库 例:比较连接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小 可以看到静态链接库的可执行文件hello1比动态链接库的可执行文件hello要大的多,他们的执行效果是一样的 8、-g选项的使用 -g选项的作用:在可执行程序中包含标准调试信息 例:将编译成包含标准调试信息的可执行文件hello2

gcc编译器使用简明指南

gcc编译器使用简明指南 gcc对文件的处理需要经过预处理->编译->汇编->链接的步骤,从而产生一个可执行文件,各部分对应不同的文件类型,具体如下: file.c c程序源文件 file.i c程序预处理后文件 file.cxx c++程序源文件,也可以是https://www.doczj.com/doc/3816674519.html, / file.cpp / file.c++ file.ii c++程序预处理后文件 file.h c/c++头文件 file.s 汇编程序文件 file.o 目标代码文件 gcc [选项]文件列表 -ansi 强制完全ANSI一致 -c 仅编译或汇编,生成目标代码文件,将.c、.i、.s等文件生成.o文件,其余文件被忽略 -S 仅编译,不进行汇编和链接,将.c、.i等文件生成.s文件,其余文件被忽略 -E 仅预处理,并发送预处理后的.i文件到标准输出,其余文件被忽略 -o file 创建可执行文件并保存在file中,而不是默认文件a.out -g 产生用于调试和排错的扩展符号表,用于GDB调试,切记-g和-O通常不能一起使用 -w 取消所有警告 -W 给出更详细的警告 -O [num]优化,可以指定0-3作为优化级别,级别0表示没有优化 -x language 默认为-x none,即依靠后缀名确定文件类型,加上-x lan确定后面所有文件类型,直到下一个-x出现为止 -D macro[=]类似于源程序里的#define,在-D macro中的macro可被源程序识别,例如gcc -D NUM -D FILE=\"bbs.txt\" hello.c -o hello,第一个-D选项定义宏NUM,在程序中可以使用#ifdef来检查是否被设置,第二个-D定义宏FILE,在源程序中可用 -U macro 类似于源程序开头定义#undef macro,也就是取消源程序中的某个宏定义

GDB基本使用方法

GDB基本使用方法 GDB是用来调试用户态程序的一款工具,可以追踪程序运行轨迹,打出调用栈,寄存器内容,查看内存等等 首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g 参数可以做到这一点。如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。 启动GDB 直接找到gdb的路径执行就ok,进入GDB后可以输入help命令查看帮助信息 加载可执行文件启动 gdb executable-file set args 参数列表 以上两步等同于 gdb –args executable-file 参数列表 run或者start都可以启动调试 多用于调试启动阶段就异常的程序 调试正在运行的程序 以下三种形式都可以attach到正在运行的程序上调试 ps -ef | grep http www-data 24470 1 0 Jan17 ? 00:00:14 /usr/sbin/lighttpd gdb attach 24470 gdb --pid 24470 gdb -p 24470 设置断点 break -- Set breakpoint at specified line or function b func1 break func1 设置在func1处 b file:line 设置在文件的第几行处 b *0x指令地址设置在具体的某条汇编指令处 设置断点后,代码执行到func1处会被断住,方便我们查看当时的信息 打印调用栈 backtrace bt 如果你要查看栈下面层的详细信息 frame 栈中的层编号 查看所有断点 info break 删除断点 delete 断点号 如果不加断点号为删除全部断点 禁用断点 disable 断点号 启用断点

Linu系统编程实验gccgdb的使用以及Makefile文件的编写

实验二:gcc 、gdb 、Makefile 的使用 实验目的: (一) 学会使用gcc 编译器 (二) 学会gdb 调试器的使用 (三) 学会编写 Makefile 实验要求: (一) 编写一应用程序,使用 gcc 进行编译,并分别使用-o ,-g ,-static ,-02等选项 (二) 编写一应用程序,使用 gdb 调试,调试中使用到该小节所介绍的所 有命令 (三) 实现一应用程序,该程序有两个 c 文件构成,使用 makefile 来完成对该程序的编译 实验器材: 软件:安装了 Linux 的vmware 虚拟机 硬件:PC 机一台 实验步骤: (一) gcc 编译器 1先用vi 编辑hello.c 文件,内容如下: #include int main(void) { priritf("hello world\n"); return 0; } 2、gcc 指令的一般格式为:gcc [选项]要编译的文件[选项][目标文件] 例:使用gcc 编译命令,编译 hello.c 生成可执行文件 hello ,并运行hello gcc]# vi hello ? c gcc]# gcc hello.c -o hello gcc]# ./hello 上面的命令一步由.c 文件生成了可执行文件,将 gcc 的四个编译 流程:预处理、编译、 汇编、连接一步完成,下面将介绍四个流程分别做了什么工作 3、 -E 选项的作用:只进行预处理,不做其他处理。 例:只对hello.c 文件进行预处理,生成文件 hello.i ,并查看 [root@locdlhost gcc ]# gcc -E hello ?匚-o hello * i [root (alocalhost gcc ]# Is hello hel lo.c: hel lo.i 通过查看可以看到头文件包含部分代码 #include 经过预处理阶段之后,编译 器已将stdio.h 的内容贴了进来。 4、 -S 选项的使用 -S 选项的作用:只是编译不汇编,生成汇编代码 [root@localhost [root@localhost [root@localho5t hello world [rootglocalhost gcc]#

Object-C 经典入门教程

Object-C 入门教程 分类:Sip&asterisk2009-05-04 16:34 16409人阅读评论(2) 收藏举报大纲 o开始吧下载这篇教学 o设定环境 o前言 o编译 hello world o创建 Classes@interface o@implementation o把它们凑在一起 o详细说明...多重参数 o建构子(Constructors) o访问权限 o Class level access o异常情况(Exceptions)处理 o继承、多型(Inheritance, Polymorphism)以及其他面向对象功 能id 型别 o继承(Inheritance) o动态识别(Dynamic types) o Categories o Posing o Protocols o内存管理Retain and Release(保留与释放) o Dealloc o Autorelease Pool o Foundation Framework ClassesNSArray o NSDictionary ?优点与缺点 ?更多信息 开始吧 下载这篇教学 ?所有这篇初学者指南的原始码都可以由objc.tar.gz下 载。这篇教学中的许多范例都是由 Steve Kochan 在 Programming in Objective-C. 一书中撰写。如果你想得到更 多详细信息及范例,请直接参考该书。这个网站上登载的所有 范例皆经过他的允许,所以请勿复制转载。 设定环境 ?Linux/FreeBSD: 安装GNUStep为了编译 GNUstep

应用程序,必须先执行位于 /usr/GNUstep/System/Makefiles/GNUstep.sh 的 GNUstep.sh 这个档案。这个路径取决于你的系统环境, 有些是在 /usr, some /usr/lib,有些是/usr/local。 如果你的 shell 是以 csh/tcsh 为基础的 shell,则应 该改用 GNUStep.csh。建议把这个指令放在 .bashrc 或 .cshrc 中。 ?Mac OS X: 安装XCode ?Windows NT 5.X: 安装cygwin或mingw,然后安装 GNUStep 前言 ?这篇教学假设你已经有一些基本的 C 语言知识,包括 C 数 据型别、什么是函式、什么是回传值、关于指针的知识以及基 本的 C 语言内存管理。如果您没有这些背景知识,我非常建议 你读一读 K&R 的书:The C Programming Language(译注:台 湾出版书名为 C 程序语言第二版)这是 C 语言的设计者所写 的书。 ?Objective-C,是 C 的衍生语言,继承了所有 C 语言的特 性。是有一些例外,但是它们不是继承于 C 的语言特性本身。 ?nil:在 C/C++ 你或许曾使用过 NULL,而在 Objective-C 中则是 nil。不同之处是你可以传递讯息给 nil(例如 [nil message];),这是完全合法的,然而你却不能对 NULL 如法炮 制。 ?BOOL:C 没有正式的布尔型别,而在 Objective-C 中也不 是「真的」有。它是包含在 Foundation classes(基本类别库) 中(即 import NSObject.h;nil 也是包括在这个头文件内)。 BOOL 在 Objective-C 中有两种型态:YES 或 NO,而不是 TRUE 或 FALSE。 ?#import vs #include:就如同你在 hello world 范例中看 到的,我们使用了#import。#import 由 gcc 编译程序支援。 我并不建议使用 #include,#import基本上跟 .h 档头尾的 #ifndef #define #endif 相同。许多程序员们都同意,使用这 些东西这是十分愚蠢的。无论如何,使用 #import 就对了。这 样不但可以避免麻烦,而且万一有一天 gcc 把它拿掉了,将会 有足够的 Objective-C 程序员可以坚持保留它或是将它放回 来。偷偷告诉你,Apple 在它们官方的程序代码中也使用了 #import。所以万一有一天这种事真的发生,不难预料 Apple 将 会提供一个支持 #import 的 gcc 分支版本。 ?在 Objective-C 中, method 及 message 这两个字是可以 互换的。不过messages 拥有特别的特性,一个 message 可以 动态的转送给另一个对象。在Objective-C 中,呼叫对象上的 一个讯息并不一定表示对象真的会实作这个讯息,而是对象知 道如何以某种方式去实作它,或是转送给知道如何实作的对象。

GCC内联汇编入门

GCC内联汇编入门 分类:linux编程2008-12-21 15:48 507人阅读评论(0) 收藏举报 目录(?)[-] 1. 前言 1. 版权与许可证 2. 回馈与更正 3. 感谢 2. 简介 3. GCC汇编语法 4. 基本内联汇编 5. 扩展内联汇编 1. 汇编程序模板 2. 操作数 3. Clobber列表 4. Volatile 6. 更多关于约束条件 1. 常用的约束 2. 约束修饰符 7. 一些有用的诀窍 8. 结束语 9. 参考 原文为GCC-Inline-Assembly-HOWTO,在google上可以找到原文,欢迎指出翻译错误。 中文版说明 由于译者水平有限,故译文出错之处,还请见谅。C语言的关键字不译,一些单词或词组(如colbber等)由于恐怕译后词不达意,故并不翻译,由下面的单词表代为解释,敬请见谅。 英文原文中的单词和词组: operand:操作数,可以是寄存器,内存,立即数。 volatile:易挥发的,是C语言的关键字。 constraint:约束。 register:本文指CPU寄存器。 asm:“asm”和“__asm__”在C语言中是关键字。原文中经常出现这个单词,是指嵌入到C语言(或者其它语言)的汇编程序片断。 basic inline assembly:指C语言中内联汇编程序的一种形式,和extended asm对 应。基本格式如下:

asm("assembly code"); extended assembly:和basic inline assembly对应,比它多了一些特性,如可以指明输入,输出等。基本格式如下: asm ( assembler template : output operands : input operands : list of clobbered registers ); clobber list:实际上就是被使用的寄存器的列表,用来告诉GCC它们已经被asm 使用了,不要在asm程序外使用它们。不然可能带来不可预见的后 果。 clobbered registers:它和clobber list对应。 assembler template:就是汇编模板,所有内联汇编代码都有按一定的格式。 见extended assembly的说明 作者:Sandeep.S 译者:吴遥 版本号 v0.1 2003年3月01日 翻译版更新日期 2008/06/11 这篇HOWTO解释GCC提供的内联汇编特性的用途和用法。学习这篇文章只须具备两个前提条件,显然那就是对x86汇编语言和C语言有基本的了解。 目录 1.前言 1.1版权与许可证 1.2回馈与更正 1.3感谢 2.简介 3.GCC汇编语法 4.基本内联汇编 5.扩展内联汇编 5.1汇编程序模板 5.2操作数 5.3 Clobber列表 5.4 Volatile … ? 6.更多关于约束条件

linuxvimgccgdb开发cc程序环境搭建

linux+vim+gcc+gdb开发C/C++程序环境搭建 我用的是ubuntu操作系统。打开终端 1.sudo apt-get install vim(vim-full 这个软件自9.10版本被废弃了,不论怎么添加软件源都找不到的,所以直接安装vim就可以了,,也可以安装gvim,,在新立得软件里面搜索vim 就可以找到了) 2.sudo apt-get install build-essential // build-essential是c语言的开发包,包含了gcc make gdb和libc函数库很多工具。 或者sudo apt-get install gcc + sudo apt-get install gdb 网上有很多版本说要编译安装,这个可能挺复杂的,而且花的时间也不少(没试过阿),,不想在命令行中安装的化,可以下载rpm包直接点击安装, 3.gcc只是一个编译器,vim是编辑器(也可以用gedit编辑源代码),gdb是调试器,, 可以新建一个test.c的helloworld文件测试以下 4.一般c程序就用gcc编译,c++程序就用g++编译

[介绍] ----------------------------------------- 常见用法: GCC 选项 GCC 有超过100个的编译选项可用。这些选项中的许多你可能永远都不会用到,但一些主要的选项将会频繁用到。很多的GCC 选项包括一个以上的字符。因此你必须为每个选项指定各自的连字符,并且就象大多数Linux 命令一样你不能在一个单独的连字符后跟一组选项。例如,下面的两个命令是不同的: gcc -p -g test.c gcc -pg test.c 第一条命令告诉GCC 编译test.c 时为prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里。第二条命令只告诉GCC 为gprof 命令建立剖析信息。 当你不用任何选项编译一个程序时,GCC 将会建立(假定编译成功)一个名为 a.out 的可执行文件。例如,下面的命令将在当前目录下产生一个叫 a.out 的文件: gcc test.c 你能用-o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out。例如,将一个叫count.c 的 C 程序编译为名叫count 的可执行文件,你将输入下面的命令: gcc -o count count.c 注意: 当你使用-o 选项时, -o 后面必须跟一个文件名。 -c 只编译并生成目标文件。 -------------------------------------------------------------------------------- gcc and g++分别是gnu的c & c++编译器gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] [参数详解]

实验一LinuxC编程工具GCC和GDB

淮海工学院计算机工程学 实验报告书 评语: 成绩:指导教师: 批阅时间:年月

实验目的与要求 1. 掌握Linux C 开发过程中的基本概念; 2. 掌握如GCC GDB等开发工具的使用。 二、实验内容 1. 将参考代码录入到文件中,编译执行后发现结果与预期不一致,请使用GDE调试, 完成字符串反序输出功能。 三、参考源代码 #include <> #include <> #include <> int reverse_str(char *string); int main (void) { char string[] = "Linux C Tools : GCC and GDB"; printf ("The original string is %s \n", string); reverse_str (string); } int reverse_str (char *str) { char *new_str; int i, size; size = strlen (str); if((new_str = (char *) malloc (size + 1)) == NULL) { return -1; } for (i = 0; i < size; i++) new_str[size - i] = str[i]; new_str[size+1] = ' '; printf("The reversed string is %s\n",new_str); free(new_str); return 0 ; } 四、实验步骤 步骤1. 编辑源代码 mkdir test1 cd test1 gedit (1) 使用gedit 编辑器,建议课外学习vim; (2) 分析代码中语句功能。 步骤 2. 编译源代码

linux系统下C编译器GCC入门

linux系统下C编译器— gcc 入门 <一>gcc简介 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为 a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。 .c为后缀的文件,C语言源代码文件; .a为后缀的文件,是由目标文件构成的档案库文件; .C,.cc或.cxx 为后缀的文件,是C++源代码文件; .h为后缀的文件,是程序所包含的头文件; .i 为后缀的文件,是已经预处理过的C源代码文件; .ii为后缀的文件,是已经预处理过的C++源代码文件; .m为后缀的文件,是Objective-C源代码文件; .o为后缀的文件,是编译后的目标文件; .s为后缀的文件,是汇编语言源代码文件; .S为后缀的文件,是经过预编译的汇编语言源代码文件。 <二>gcc的执行过程 虽然我们称gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,. S为后缀的汇编语言源代码文件和汇编,.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。 <三>gcc的基本用法和选项 在使用gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。g cc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。

Ubuntu下Vim GCC GDB安装及使用

Ubuntu下Vim+GCC+GDB安装及使用 一)安装 vim)打开命令行运行sudo apt-get install vim,并按提示输入管理员密码。 gcc+gdb)输入命令行运行 sudo apt-get install build-essential build-essential包含gcc和gdb等工具,是C语言的开发包。 安装完了可以执行 gcc --version 的命令来查看版本,输出如下: gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 则表明安装好了。 二)常用编译命令选项 假设源程序文件名为test.c。 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。 3. 选项 -E 用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件。 4. 选项 -S 用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。 5. 选项 -c 用法:#gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件。 6. 无选项链接 用法:#gcc test.o -o test

gcc编译器使用说明

要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。然后,我们简要介绍一下编译器究竟作了那些工作,以及如何控制编译过程。我们也简要介绍了调试器的使用方法。 GCC rules 你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马。Ken Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和永久的木马。请到这里阅读他对这个杰作的描述。幸运的是,我们有了gcc。当你进行 configure; make; make install 时, gcc在幕后做了很多繁重的工作。如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。我们将看看如何编译C程序,以及如何使用编译选项让gcc按照我们的要求工作。步骤(以及所用工具)如下:预编译 (gcc -E),编译 (gcc),汇编 (as),和连接 (ld)。 开始... 首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。(各位老前辈,请原谅我)。 #include int main() { printf("Hello World!\n"); } 把这个文件保存为 game.c。你可以在命令行下编译它: gcc game.c 在默认情况下,C编译器将生成一个名为 a.out 的可执行文件。你可以键入如下命令运行它:a.out Hello World 每一次编译程序时,新的 a.out 将覆盖原来的程序。你无法知道是哪个程序创建了 a.out。

Proteus入门教程完整版

Proteus 入门教程 本文将简单介绍一下Proteus 的使用。在这里,我用的Proteus 版本是Proteus 6.7 sp3 Professional。 一、Proteus 6 Professional 界面简介 安装完Proteus 后,运行ISIS 6 Professional,会出现以下窗口界面: 为了方便介绍,我分别对窗口内各部分进行中文说明(见上图)。下面简单 介绍各部分的功能: 1.原理图编辑窗口(The Editing Window):顾名思义,它是用来绘制原理 图的。蓝色方框内为可编辑区,元件要放到它里面。注意,这个窗口是 没有滚动条的,你可用预览窗口来改变原理图的可视范围。 2.预览窗口(The Overview Window):它可显示两个内容,一个是:当你 在元件列表中选择一个元件时,它会显示该元件的预览图;另一个是, 当你的鼠标焦点落在原理图编辑窗口时(即放置元件到原理图编辑窗口 后或在原理图编辑窗口中点击鼠标后),它会显示整张原理图的缩略图, 并会显示一个绿色的方框,绿色的方框里面的内容就是当前原理图窗口 中显示的内容,因此,你可用鼠标在它上面点击来改变绿色的方框的位 置,从而改变原理图的可视范围。 3.模型选择工具栏(Mode Selector Toolbar): 主要模型(Main Modes): 1* 选择元件(components)(默认选择的) 2* 放置连接点 3* 放置标签(用总线时会用到) 4* 放置文本 5* 用于绘制总线 6* 用于放置子电路 7* 用于即时编辑元件参数(先单击该图标再单击要修改的元件) 配件(Gadgets): 1* 终端接口(terminals):有VCC、地、输出、输入等接口 2* 器件引脚:用于绘制各种引脚 3* 仿真图表(graph):用于各种分析,如Noise Analysis 4* 录音机 5* 信号发生器(generators) 6* 电压探针:使用仿真图表时要用到 7* 电流探针:使用仿真图表时要用到 8* 虚拟仪表:有示波器等 2D 图形(2D Graphics): 1* 画各种直线 2* 画各种方框 3* 画各种圆 4* 画各种圆弧

gcc入门教程

不经意间,GCC已发展到了4.3的版本,尽管在软件开发社区之外乏人闻问,但因为GCC 在几乎所有开源软件和自由软件中都会用到,因此它的编译性能的涨落会直接影响到Linux 、Firefox 乃至于https://www.doczj.com/doc/3816674519.html,和Apache等几千个项目的开发。因此,把GCC摆在开源软件的核心地位是一点也不为过。另一方面,GCC4.3的出现,正在牵引着广大程序员们的心。如果我们非要用一个词来说明GCC与程序员之间的关系,那无疑是"心随心动"。 历史篇 作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持C 语言;它现在还支持Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury 语言,等等。而GCC 也不再单只是GNU C 语言编译器的意思了,而是变成了GNU Compiler Collection 也即是GNU 编译器家族的意思了。另一方面,说到GCC 对于各种硬件平台的支持,概括起来就是一句话:无所不在。几乎所有有点实际用途的硬件平台,甚至包括有些不那么有实际用途的硬件平台。 Gcc 简介 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。Gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。 官方网站:https://www.doczj.com/doc/3816674519.html,/ gcc是linux的唯一编译器,没有gcc就没有linux,gcc的重要性就不可言喻啦。居然这么重要,那就很值得我们来好好研究下啦。好啦,开始我们的gcc之旅吧! 首先消除gcc和g++误区吧。 gcc和g++都是GNU(组织)的一个编译器。 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:#include int main(int argc, char* argv[]) { if(argv == 0) return; printString(argv); return; } int printString(char* string) { sprintf(string, "This is a test.\n"); } 如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString 未定义”; “cannot convert `char**' to `char*”;

gcc-gdb-make操作简介

gcc-gdb-make操作简介 1. 编译工具gcc使用方法和常用选项说明 (2) 简介 (2) 实例1 (2) 实例2 (5) 2. 调试工具gdb使用方法和常用命令说明 (7) 简介 (7) 实例 (8) 3. 维护工具make使用方法说明 (10) 简介 (10) 实例 (10) 说明: 本文档结合实例说明了gcc、gdb、make工具基本用法。

1. 编译工具gcc使用方法和常用选项说明 简介 gcc,全称GNU Compiler Collection,是目前Linux平台上最常用的C语言编译系统,符合ANSI C标准。因为开源,随着不断完善,它能够编译用C、C++和Objective-C等语言编写的程序。 当调用gcc时,通常情况下会完成整个过程(预处理→编译→汇编→链接)。但是,可以通过使用gcc的命令选项,使其处理过程只进行到某个中间环节。 下表列出了gcc常用选项的格式及功能。 实例1 (以hello.c程序的编辑、编译为例) 第1步,为了便于观察实验结果,在用户主目录下创建子目录TEST,然后进入子目录。 第2步,使用vi/vim/gedit编写一个简单的c程序hello.c

第3步,使用gcc工具进行编译。 ①不带任何选项 gcc hello.c表示一次性完成对源程序的编译、连接过程,并生成可执行文件,默认为a.out。 ./a.out表示执行当前路径下的可执行文件a.out。 ②使用选项-o gcc hello.c–o hello表示对hello.c进行编译、连接,并指定输出的可执行文件名为hello。 ./hello表示执行当前路径下的可执行文件hello。 ③使用选项-c gcc hello.c –c表示对hello.c进行编译,但不进行连接。生成目标文件为hello.o。用ls可以查看。 继续对目标文件进行连接,并指定生成的可执行文件名为hello. gcc hello.o–o hello表示对目标文件hello.o进行连接,生成可执行文件hello。 ④使用选项-I 为了说明选项-I的用途,先做如下准备工作: a) 返回TEST目录的上级目录,然后使用vi/vim/gedit编辑器或gedit编写头文件t1.h

OpenCV入门教程

OpenCV 入门教程 作者:于仕琪 shiqi.yu@https://www.doczj.com/doc/3816674519.html, https://www.doczj.com/doc/3816674519.html, 2012 年 8 月 版权所有?于仕琪 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

前言 OpenCV 是一个广受欢迎的开源计算机视觉库,它提供了很多函数,实现了很多计算机视觉算法,算法从最基本的滤波到高级的物体检测皆有涵盖。很多初学者希望快速掌握OpenCV 的使用方法,但往往会遇到各种各样的困难。其实仔细分析,造成这些困难的原因有两类:第一类是C/C++编程基础不过关;第二类是不了解算法原理。解决这些困难无非提升编程能力,以及提升理论基础知识。提升编程能力需要多练习编程,提升理论知识需要系统学习《数字图像处理》、《计算机视觉》和《模式识别》等课程,所有这些都不能一蹴而就,需要耐下心来认真修炼。 同时我们也需要认识到 OpenCV 只是一个算法库,能为我们搭建计算机视觉应用提供“砖头”。我们并不需要完全精通了算法原理之后才去使用 OpenCV,只要了解了“砖头”的功能,就可以动手了。在实践中学习才是最高效的学习方式。本小册子希望为初学者提供引导,使初学者快速了解 OpenCV 的基本数 据结构以及用法。 此外,如您发现有错误之处,欢迎来信指正。 于仕琪 深圳大学 插播广告:欢迎有能力、有激情以及对计算机视觉有兴趣的同学报考我的 研究生。欲了解详情可以访问深圳大学招生网https://www.doczj.com/doc/3816674519.html,/或者给我发 email。

目录 第 1 章预备知识 (5) 1.1 编程的流程 (5) 1.2 什么叫编辑 (6) 1.3 什么叫编译 (6) 1.4 什么叫连接 (7) 1.5 什么叫运行 (7) 1.6 Visual C++是什么 (8) 1.7 头文件 (9) 1.8 库文件 (10) 1.9 OpenCV 是什么 (11) 1.10 什么是命令行参数 (12) 1.11 常见编译错误 (13) 1.11.1 找不到头文件 (13) 1.11.2 拼写错误 (14) 1.12 常见链接错误 (15) 1.13 运行时错误 (17) 第 2 章OpenCV 介绍 (19) 2.1 OpenCV 的来源 (19) 2.2 OpenCV 的协议 (19) 第 3 章图像的基本操作 (21) 3.1 图像的表示 (21) 3.2 Mat 类 (23) 3.3 创建 Mat 对象 (24) 3.3.1 构造函数方法 (24) 3.3.2 create()函数创建对象 (25) 3.3.3 Matlab 风格的创建对象方法 (26)

linux、GCC、GDB学习总结

1 虚拟机VMware6.5、RedHat安装及Linux基本命令 1.1 GCC、GDB的安装 虚拟将上安装RedHat后,在Linux环境下编辑和编译C\C++需要GCC、GDB编译,调试,Linux环境下输入gcc -v于gdb –v可以查看所装系统是否装有gcc与gdb。如果没有显示其所装版本,可以在Redhat 的RPMs包中找到相应版本的gcc与gdb的rmp安装文件。具体方法是vm->Removable Devices->CD\DVD->Connect. 把RedHat的镜像文件添加到use iso image file:下,点击OK,在VMware界面上出现以个光盘的标志双击后RedHat->RAMPS,选择要安装的GCC、与GDB文件。 注:不能直接用GCC变异C++文件,最好使用G++编译。

1.2 Linux基本命令 Linux常用命令全集:https://www.doczj.com/doc/3816674519.html,/special/linuxcom/ 2 GCC、GDB的使用及基本指令 2.1 Linux环境下vi编辑器的基本使用方法 VMware界面上右键->open terminal 界面中输入vi 回车([jkl@localhost ~]$ vi) 在vi编辑器下输入要编辑的程序: #include int wib(int no1, int no2) { int result, diff; diff = no1 - no2; result = no1 / diff; return result; } int main(int argc, char *argv[]) { int value, div, result, i, total; value = 10; div = 6; total = 0; for(i = 0; i < 10; i++) { result = wib(value, div); total += result; div++; value--; } printf("%d wibed by %d equals %d\n", value, div, total); return 0; vi环境下输入模式与指令模式的切换键是Esc,当左下角出现--INSERT--时可以对程序进行编辑。按下Esc后,可以输入vi指令,会在窗口最下一行显示,

AVR studio_gcc基础入门

注意:WinAVR和AVRStudio是2个不同的软件,前者是开源项目,不属于At mel所有,后者是Atmel版权所有的。 2.安装步骤 1)安装WinAVR 2)安装AVRStudio 3)安装AVRStudio的ServicePack(如果有的话) 3.新建测试工程 1)启动AVRStudio 2)选择"NewProject" 3)"Projecttype"里选择"AVRGCC",单击"Location"旁的按钮,选择工程保存位置(这里假设为C:\),避免路径中有中文,在"Projectname:"里填入工程名test01,把"Createinitialfile"的钩去除,把"Createfolder"钩上,单击"N ext"。 4)"Debugplatform:"里选择"AVRSimulator","Device:"里选择"Atmega128 ",单击"Finish" 5)菜单File,NewFile,建立空白文档,复制以下代码到该文档中(注意:最后一个“}”下面还有一个空行): #i nclude"avr/io.h" intmain(void) { while(1); } 6)菜单File,Save,在“另存为”对话框里选择工程保存的路径下工程名命名的文件夹下(这里假设为C:\test01\),你会看到已经有一个test01.aps 文件存在了,那是AVRStudio的工程文件。“文件名”里填入“main.c”,保存。 7)在"AVRGCC"工程管理窗格内的"SourceFiles"上单击右键,右键菜单里选择"AddExistingSourceFile(s)...",在"AddSourceFile"里选择刚刚建立的mai n.c文件。会看到工程管理窗格内的"SourceFiles"下多了个main.c文件。

Ubuntu入门教程

Ubuntu入门教程 【安装篇】 注明:本文是在在前人的基础上改动这篇针对8.10的新手教程了。序言 ubuntu 还是很守信用的,说是10.30号发布新版,果然在30日晚10来点钟发布了(白天等了一天,等的我急死了,网上虽然说早有正式版链接下载,但是官方没公布,还是不敢下载,后来官方一公布,黑,没忽悠我,和网上流传的是一样的)。下载,刻碟,安装,现在我已经在8.10下,边听着歌曲,聊着 QQ, 本文针对菜鸟而写,高手略过!对菜鸟来说,不要先研究里面的命令是什么意思,你先照做,以后回来在看你就知道这些命令是干什么的了,先教会你用 ubuntu娱乐,怎么听歌,怎么上QQ,怎么在优酷网,土豆网,新浪博客看《越狱》《色戒》或搞笑视频,在线看NBA或欧洲足球联赛直播,下载看美国科幻片,以及看小日本的A片,这些熟练了在研究什么命令、内核之类的东西,切记,不然打击你学习linux的自信!还有个很重要的技巧:不管学习什么系统,什么软件,最快速的上手办法是什么??是按F1键,看这个软件自带的帮助,我们国内很多计算机书籍说不好听点就是复制的软件自带的帮助,还卖好几十块钱一本,黑心啊!这个技巧对windows系统下软件学习,linux系统下的软件学习都是很有好处的,在桌面上按一下F1是不是就有了“欢迎来到Ubuntu 帮助中心”??不要会一种软件换了一种就不会了,我们学习计算机知识是学习一种思想,就是比没学过计算机的人掌握新东西的能

力更强,运用软件方面一通百通,不管它有什么新功能!同时要大胆点,不要怕搞坏系统,(也要分地方,不要在有重要文件的公司或服务器上练手,坏了的话你承担不起那责任)搞坏在装嘛,不练几次你能进步么,我相信论坛里的高手都不只装过一遍系统吧,少说多干,现在开始打造娱乐型ubuntu8.1! 第一个20分钟,简单和期待的20分钟: 1、硬盘安装: 本版本页面(至少在我发的时候)就有几个关于此安装法的帖子,我就不说了。 2.CD安装 一般人都是先安装了windows的,在这种情况下,把硬盘最后一个盘分出空间出来,大小你自己定,我划的20G。 安装的时候分区时选手动,弄一个/swap(交换分区)和/(根分区)就行了,安装的时候一定要拔掉网线,否则很慢。 如果你是装的windows+ubuntu双系统,但是想要安装更新的ubuntu (比如现在的8.10),千万不要在windows下格式化,否则连windows 都进不去了,直接覆盖安装,在分区的时候,把/分区选中格式化就行。提醒:1、不要在安装时候什么都不看就一直狂按回车往下进行,你至少也该看看提示吧!尤其在安装到哪个分区和ubuntu的分区格式是什么样的形式时候,和 windows不一样,既然考虑玩ubuntu ,就尽量摆脱windows考虑问题的模式!否则会因为安装不当导致系统其他分区被破坏而把怒火发到ubuntu上!其实稍微了解下这个安装过程是很简单

相关主题
文本预览
相关文档 最新文档