首页
登录 | 注册

C语言编译器MINGW的使用说明

在mingw环境中生成和使用dll都是十分方便的。
1.生成dll
gcc(g++) -shared -o test.dll test.c
 
一直用VS,看现在Eclipse很火,便想弄一下玩玩,用到了MINGW,继而用到了GCC,对GCC相当的不熟悉,从头开始学一些简单的吧。
 
简单的GCC用法~
gcc命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再慢慢学习其它选项,免得因选项太多而打击了学习的信心。
一. 常用编译命令选项
假设源程序文件名为test.c。
1. 无选项编译链接
用法:#gcc test.c
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。编译成功后可以看到生成了一个a.out的文件。在命令行输入./a.out 执行程序。./表示在当前目录,a.out为可执行程序文件名。
2. 选项 -o
用法:#gcc test.c -o test
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。输入./test执行程序。
3. 选项 -E <大写,注意>
用法:#gcc -E test.c -o test.i
or
作用:将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
作用:将编译输出文件test.o链接成最终可执行文件test。输入./test执行程序。
7. 选项-O
用法:#gcc -O1 test.c -o test
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。输入./test执行程序。
二. 多源文件的编译方法
如果有多个源文件,基本上有两种编译方法:
[假设有两个源文件为test.c和testfun.c]
1. 多个文件一起编译
用法:#gcc testfun.c test.c -o test
作用:将testfun.c和test.c分别编译后链接成test可执行文件。
2. 分别编译各个源文件,之后对编译后输出的目标文件链接。
用法:
#gcc -c testfun.c //将testfun.c编译成testfun.o
#gcc -c test.c //将test.c编译成test.o
#gcc  testfun.o test.o -o test //将testfun.o和test.o链接成test
以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
 
1. gcc的家族成员
    总的来说,gcc应该是一个编译器。可是,为什么我还要在这里介绍gcc的家族成员呢?其实,整套的gcc环境并不是由gcc构成的,他是由多个包所组成的。这些包的互相作用产生了gcc的开发环境。其中,有一些包是你开发应用程序所必备的基本包。离开这些包你将无法正常使用gcc。
    gcc开发环境包括如下几大包:
    binary                         基本包   提供基本的汇编器,连接器等
    gcc                            基本包   各种语言的编译器,包括C,C++,Ada,Java等
    Win32api,mingwi-runtime/glibc  基本包   系统函数库
    make/automake                  需要包   管理项目编译的程序
    gdb                            附加包   调试程序
2. gcc的常用编译参数
    同VC,TC等编译器不同,gcc其实是可以很方便的在提示符下编译程序的。gcc在提示符下编译程序,并没有如同VC那样的冗长而晦涩的编译参数。相反,却有着比VC更灵活且简短的参数。
    不得不承认,不懂gcc编译参数的人,确实会损失一些gcc的强大功能。所以,我下面简单介绍一下gcc的一些基本编译参数。这里,我以C编译器为例。
    注意:gcc的编译参数是区分大小写的。
    
    编译二进制代码
    gcc -c yours.c -o yours.o
    使用这段指令,gcc将会把yours.c编译成yours.o的二进制代码。其中,yours.o就类似于VC,TC中的.obj文档。
    编译最简单的小程序
    gcc -o yours yours.c
    通过这条指令,gcc将会把yours.c源代码编译成名为yours的可执行程序。当然,您也可以将yours.c改成我们刚才介绍的yours.o文件。这样,gcc将使用编译刚才编译好的二进制文档来链接程序。这里,格式的特点是,-o 后面是一串文件列表,第一个参数是所编译程序的文件名,从第二个开始,就是您编译和连接该可执行程序所需要的二进制文档或者源代码。
    编译时将自己的头文件目录设为默认头文件目录
    gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o
    这条指令中的-I参数将会把Your_Include_Files_Document_Path添加到你默认的头文件目录中。这样您将可以使用 #include 来导入头文件。
    编译时使用自己的静态库存放目录
    gcc -L”Your_Lib_Files_Document_Path” -o yours yours.o
    这条指令将会让gcc在连接时除了在默认Lib存放目录中搜索指定的静态库以外,还会在Your_Lib_Files_Document_Path中搜索。
    编译时使用静态连接库
    gcc -lyour_lib -o yours yours.o
    这条指令将会让gcc在连接时把 libyour_lib.a中您所用到的函数连接到可执行程序中。此处注意,gcc所使用的静态连接库是lib*.a格式的。在连接时,只且仅需要提供*的内容就可以了。
    编译时使用优化
    gcc -O2 -c yours.c -o yours.o
    使用优化方式编译程序,其中除了-O2以外,还有-O3 -O1等等。他们代表不同的优化等级。最常用的,是-O2优化。当然,还有针对特殊CPU的优化,这里就不介绍了。
    编译时显示所有错误和警告信息
    gcc -Wall -c yours.c -o yours.o
    gcc在默认情况下,将对一些如变量申请未使用这样的问题或者申请了没有给予初始值的问题忽略。但是,如果使用了-Wall参数,编辑器将列出所有的警告信息。这样,您就可以知道您的代码中有多少可能会在其他操作系统下出错的地方了。(用这个指令看看你的代码有多少地方写的不怎么合适。)
    编译连接时,加入调试代码
    gcc -g -o yours yours.c
    正如同VC有debug编译模式一样,gcc也有debug模式。添加了-g 参数编译的可执行程序比普通程序略为大一些,其中添加了一些调试代码。这些代码将被gdb所支持。
    连接时缩小代码体积
    gcc -s -o yours yours.o
    因为有人说Visual-MinGW生成的代码小,于是研究了一下它的编译参数,发现release模式的编译参数就加了这一项。貌似编译后的代码的确缩小了很多。
    反汇编
    gcc -S yours.c
    用这个指令能把C语言变成汇编语言,不过不是常见的Intel语法,而是AT&T语法。两者的语法有很大的区别。
    获得帮助
    gcc --help
    这条指令从意思上就能看出,获得gcc的帮助信息。如果您有什么特殊需要,也许这个指令能帮上点小忙。
    总结:
    gcc的编译参数是可以组合起来的,如:
    gcc yours.c -o yours -Wall -s -O2
    预告:下一篇将介绍用gdb调试C程序

相关文章

  • Java基础20:Java8新特性终极指南
    这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Ja ...
  • 一.编译准备: 工作电脑的环境是Ubantu10.04.   确认 Ubantu是否已经安装 gmp 和 mpfr . 若没有,下载安装,地址如下: 1. gmp-4.3.2.tar.bz2 2. mpfr-3.1.1.tar.bz2   ...
  • 前面12节的课程,主要针对 Linux 内核中 GNU C 扩展的一些常用 C 语言语法进行了分析.GNU C 的这些扩展语法,主要用来完善 C 语言标准和编译优化.而通过 C 标准的发展过程我们又发现,对于一些编译器扩展的一些特性,或者其 ...
  • 这一节,接着讲 __atttribute__ 属性声明,__atttribute__ 可以说是 GNU C 最大的特色.我们接下来继续讲一下跟内联函数相关的两个属性:noinline 和 always_inline.这两个属性的用途是告诉编 ...
  • GNU C 增加一个 __atttribute__ 关键字用来声明一个函数.变量或类型的特殊属性.声明这个特殊属性有什么用呢?主要用途就是指导编译器在编译程序时进行特定方面的优化或代码检查.比如,我们可以通过使用属性声明指定某个变量的数据边 ...
  • GNU 通过 __atttribute__ 扩展的 format 属性,用来指定变参函数的参数格式检查. 我们经常实现一些自己的打印调试函数.这些打印函数往往是变参函数,那编译器编译程序时,怎么知道我们的参数格式对不对呢?因为我们实现的是变 ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.012 s.
京ICP备10005923号