`
liubin2010
  • 浏览: 303658 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

gcc 编译多个源文件 (转)

    博客分类:
  • c++
 
阅读更多
一. 常用编译命令选项
假设源程序文件名为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
作用:将编译输出文件test.o链接成最终可执行文件test。

7. 选项-O
用法:#gcc -O1 test.c -o test
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。



二. 多源文件的编译方法

如果有多个源文件,基本上有两种编译方法:
[假设有两个源文件为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 -o testfun.o test.o -o test //将testfun.o和test.o链接成test

以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。



3. 如果要编译的文件都在同一个目录下,可以用通配符gcc *.c -o 来进行编译。

你是否会问,如果是一个项目的话,可能会有上百个文件,这样的编译法,人不是要累死在电脑前吗,或者等到你编译成功了,岂不是头发都白了,呵呵,所以我们要把上述的编译过程写进以下一个文本文件中:
Linux下称之为makefile

#这里可以写一些文件的说明
MyFirst: MyFirst.o hello.o
g++ MyFirst.o hello.o -o MyFirst
Hello.o:Hello.cpp
g++ -c Hello.cpp -o Hello.o
MyFirst.o:MyFirst.cpp
g++ -c MyFirst.cpp -o MyFirst.o

makefile 编写规则:
(1)以“#”开始的行为注释
(2)文件依赖关系为:
    target:components
    rule

存盘为MyFirst,在终端输入:make MyFist ,程序出现了错误可是所有程序员共同的敌人,在编写程序时我们应该尽量的去避免错误的出现,不过编写的时候再怎么都不可避免的出现这样那样的错误,对程序 进行必要的调试是一个好主意,那我们怎么来调试程序呢,看下面:

gdb ./文件名 ////////////////在这里我修改下要想下面可以调试,在上面编译的 时候必须加上参数g,g++ -g hello.cpp -o hello

以下为调试状态下的可以用到的命令(可以仅输入单词的输入,如break可简为b),尖括号中为说明

list <显示源代码>
break 行号 <设置断点>
run <运行程序>
continue <继续从断点处执行>
print 变量 <调试时查看变量的值>
del 行号 <删除断点>
step <单步执行,可跟踪到函数内部>
next <单步执行,不可跟踪到函数内部>
quit <退出>

makefile 的编写不是件容易的事情,因为自己写的makefile可能不能在所有的unix/linux类操作系统下通用。因此在很多项目中都用automake.autoconf或者是Cmake等工具。


分享到:
评论

相关推荐

    编译JNI的gcc指令代打和测试例程

    使用gcc和g++编译jni指令太长,很麻烦。所以做了一个编译工具JNIBuilder.jar。 因为是用于jni的,所以默认使用者的电脑上已经安装好Java和MinGW,并且可用。 并提供一个测试例程。...新手工具,不支持多个源文件。

    GCC使用手册(和常用命令解释)

    GCC编译器完成从C、C++、objective-C等源文件向运行在特定CPU硬件上的目标代码的转换(这是任何一个编译器需要完成的任务)。 GCC能够处理的源文件分为C、C++...连接,把多个目标代码模块连接生成一个大的目标模块;

    gcc-7.5-安装套件.zip

    这是gcc7.5的安装文件.ubuntu18.04自带的gcc是5.4的,现在很多源文件需要用更高版本的gcc才能编译通过,gcc编译依赖多个其他库文件,这里包含其他库文件的安装文件. 安装步骤如下:...

    GCC资料大全.chm

    他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的 语言,但是对编译器来说,后缀名控制着缺省设定: gcc 认为...

    GNU GCC 手冊.zip

    他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的 语言,但是对编译器来说,后缀名控制着缺省设定: gcc 认为...

    gcc,make指南,gdb调试GCC程序资料打包

    一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为...

    GCC使用手册

    他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的 语言,但是对编译器来说,后缀名控制着缺省设定:

    一个通用Makefile的编写

    如果我们用gcc去一个一个编译每一个源文件的话,效率会低很多,但是如果我们可以写一个Makefile,那么只需要执行一个make就OK了,这样大大提高了开发效率。但是Makefile的语法规则众多,而且缺乏参考资料,对于初学...

    Linux/Unix环境下的make命令详解

    利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,...

    JNI指令代打2.0

    可以同时选择多个源文件,C文件和CPP文件可以混合在一起编译。 与上一版的改进是增加了错误窗口,和多文件编译支持。 需要把该工具放在源文件的母文件夹或相同文件夹。目标文件要在该工具的相同文件夹或者子文件夹。

    LinuxUnix环境下的make和makefile详解

    利用make工具,我们能将大型的研发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程式,使用make和makefile工具就能简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果...

    多个共享内存构成环形缓冲实验.zip

    利用多个共享内存(有限空间)构成的环形缓冲,将源文件复制到目标文件,实现两个进程的誊抄。 三、实验设计 3.1 开发环境 处理器:Intel Core i7-8550U CPU @ 1.80GHz × 8 操作系统类型:Ubuntu 16.04 IDE: Clion...

    source_code:许多(!).c .cpp源文件-用于Linux上的gcc编译或Windows上的MinGW-W64-windows source code

    计算素数 eprime2程序派生自...运行价值10亿(1000000000)的程序需要花费90分钟多的时间才能找到50,847,534个素数。 作者 原文来自[Matt Thompson](mailto: )由[Ted Swoyer](mailto: )修改 执照 GPL v3

    SCON工具源码

    如果你的项目由多个源文件组成,而且你想指定一些编译的宏定义,以及显式的指定使用某些库,这些对于 SCons 来说,都是非常简单的事情。我们的另外一个例子 helloscons2 很好的说明这种情况。 helloscons2 由 3 个...

    如何编写Makefile

    一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复 杂的功能操作,因为...

    如何编写mkefile

    一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复 杂的功能操作,因为...

    基于make命令与makefile文件详解

    一、多个源文件带来的问题 在编写c/c++测试程序时,我们习惯每次修改一处代码,然后就马上编译运行来查看运行的结果。这种编译方式对于小程序来说是没有多大问题的,可对于大型程序来说,由于包含了大量的源文件,...

    typeof_common.zip_Boost_boost vc6_msc.dll_typeof

    笔者最近作一个项目时需要用比较hack的手段把第三方的dll(无lib但有头文件)里面的外部函数以函数指针的方式提取出来给其他模块作全局变量用,500多个函数呀,声明函数指针可不是个轻松事,类型名字至少排满一行,写了50...

    实例详解Linux下的Make命令

    利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件...

    跟我一起写makefile

    一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。 链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数...

Global site tag (gtag.js) - Google Analytics