ubuntu下C/C++编译

在ubuntu环境下对C/C++进行编译首先保证ubuntu系统中包含编译工具(g++/gcc)和编辑工具(vim)
如果环境中不存在可以在终端中输入以下命令进行安装:
sudo apt-get install build-essential
sudo apt-get install gcc
sudo apt-get install g++

初次之外了解gcc和g++之间的区别见如下链接
https://blog.csdn.net/u013457167/article/details/80222557

一、C/C++语言

新建后缀名为.c的文件。本文中定义文件名称为hello。建立使用方式在ubuntu下终端采用命令行的方式。
1、新建文件

   C语言:   touch hello.c
   C++语言: touch hello.cpp

新建立文件如下图所示(采用c语言作为示例):
在这里插入图片描述
2、编辑文件

C语言:    vim hello.c
C++语言:  vim hello.cpp

使用命令行建立如下图所示(采用c语言作为示例):
在这里插入图片描述
桌面建立文件展示如下图所示:
在这里插入图片描述
3、编译文件
在文件所在文件目录的终端下,输入

C语言:  gcc hello.c -o hello
C++语言:g++ hello.cpp -o hello

生成可执行文件,如下图所示:
在这里插入图片描述
4、执行文件

./hello

启动执行文件,示例如下图所示:
在这里插入图片描述
linux系统下g++和gcc命令详解
一、编译过程
1、预处理:生成.i的文件【预处理器cpp】
2、将预处理后的文件转成汇编语言,生成文件.s【编译器】
3、将汇编变为目标代码(机器代码)生成.o的文件【汇编器】
4、连接目标代码,生成可执行程序【连接器】
二、参数详解
gcc命令的基本用法如下:

gcc [options][filenames]

如果是c++ 直接将gcc改为g++即可。

1.预处理-Pre-Processing

gcc  -E  test.c  -o  test.i    //.i文件

2.编译-Compiling

gcc  -S  test.i  -o   test.s  //.s文件

3.汇编-Assembling //.o文件

gcc  -c  test.s  -o  test.o

4.链接-Linking //bin文件

gcc  test.o  -o  test

1)-E参数

-E 选项指示编译器仅对输入文件进行预处理。当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里.

2)-S参数

-S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译。 GCC 产生的汇编语言文件的缺省扩展名是 .s 。

3)-c参数

-c 选项告诉 GCC 仅把源代码编译为目标代码。缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名。

4)-o参数

-o 编译选项来为将产生的可执行文件用指定的文件名。

5)-O参数

-O 选项告诉 GCC 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2 选项告诉 GCC 产生尽可能小和尽可能快的代码。 如-O2,-O3,-On(n 常为0–3);

-O 主要进行跳转和延迟退栈两种优化;

-O0 表示不做优化

-O1 为默认优化

-O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。

-O3 则包括循环展开和其他一些与处理特性相关的优化工作。

选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。

如:

[root@localhost test]# gcc test.c -O3
 
[root@localhost test]# gcc -O3 test.c
 
[root@localhost test]# gcc -o tt test.c -O2
 
[root@localhost test]# gcc -O2 -o tt test.c

6)调试选项-g和-pg
 GCC 支持数种调试和剖析选项,常用到的是 -g 和 -pg 。

-g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序。GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里你能使-g 和 -O(产生优化代码)联用。

-pg 选项告诉 GCC 在编译好的程序里加入额外的代码。运行程序时, 产生 gprof 用的剖析信息以显示你的程序的耗时情况。

7) -l参数和-L参数

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?

就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名 了。

如:

gcc  xxx.c  -lm( 动态数学库)

-lpthread
比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把 libtest.so拷贝到 /usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还 需要与 libtest.so配套的头文件)。
放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里, 这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find-lxxx”,也就是链接 程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库 ,它放在/usr/X11R6/lib目录 下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest

另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6 又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so

手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如 gtk1.2的链接参数生成程序是gtk-config,执行gtk-config –libs就能得到以下输出”-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm”,这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了–libs参数外还有一个参数是–cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config –libs –cflags,看看输出结果。

现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个xxxx-config --libs --cflags,比如编译一个gtk程序:gcc gtktest.c gtk-config --libs --cflags这样就差不多了。注意`不是单引号,而是1键左边那个键。

除了xxx-config以外,现在新的开发包一般都用pkg-config来生成链接参数,使用方法跟xxx-config类似,但xxx-config是针对特定的开发包,但pkg-config包含很多开发包的链接参数的生成,用pkg-config –list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg-config pagName –libs –cflags,其中pagName是包名,是pkg-config–list-all里列出名单中的一个,比如gtk1.2的名字就是gtk+, pkg-config gtk+ –libs –cflags的作用跟gtk-config –libs –cflags是一样的。比如:

gcc gtktest.c `pkg-config gtk+ --libs --cflags`。

8) -include和-I参数

-include用来包含头文件,但一般情况下包含头文件都在源码里用#i nclude xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但 是如果头文件不在/usr/icnclude里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude 参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错误。-I参数可以用相对路径,比如头文件在当前 目录,可以用-I.来指定。上面我们提到的–cflags参数就是用来生成-I参数的。

9)-Wall、-w 和 -v参数

 -Wall 打印出gcc提供的警告信息
 
 -w     关闭所有警告信息
 
 -v      列出所有编译步骤
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绛洞花主敏明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值