Linux下的g++使用总结

什么是g++和gcc

都是编译器,准确的说都是GNU(组织)的一个编译器
区别:
后缀为.c的文件gcc把它当做c程序,g++当做c++程序。后缀为c++的两者都当做c++程序。对于cpp程序,无论gcc或者是g++编译阶段都是相同的,都是用的gcc进行编译,但是在链接阶段gcc不能自动和c++程序使用的库连接,如果使用的话,形如下: gcc helloworld.cpp -lstdc++ -o helloworld
所以我们通常用g++来进行连接(g++会自动连接c++常用库),所以为了使用方便对于cpp程序干脆编译链接统统都使用g++,这样就给人一种错觉,好像cpp只能用g++编译。
这里写图片描述

过程分析

第一步:预处理

   预处理阶段过程如下,预处理阶段是进行**处理代码中的宏和include指令,并作语法检查**。这一过程的命令为:#  gcc -E hello.c -o hello.i 执行这一部生成了一个hello.i文件,如下:

g++ -E main.cpp -o hello.i
cat hello.i | wc -l
显示:17557

可以看到由于进行了预处理,将include内部的文件进行了替换,预处理后的结果文件显得特别大,所以在以后的程序中,没有用到的头文件最好不要引入,这样会降低处理时间和空间。

第二步:汇编程序生成汇编码

这一步是将预处理文件进行汇编,生成汇编程序,命令如下:

g++ -S hello.i -o hello.s
查看文件内容:
cat hello.s
cc查看多少行:
cat hello.s | wc -l
(83行)
可以看到生成的汇编代码是83行。上述这个过程可以看做是编译,即生成汇编代码,不进行汇编和链接,即只激活预处理和编译,生成汇编语言。

第三步:由汇编程序转换为中间目标文件

这一步是将汇编的代码进一步进行处理,每一个源程序都会生成相应的目标文件,是以.o为扩展名的文件。命令如下:

g++ -c hello.s -o hello.o

cat hello.o可以看到一段乱码
cat hello.o | wc -l可以看到有13行。

第四步:连接目标文件,生成可执行程序

这一阶段被称为链接阶段,这一阶段完成的是将目标文件进行连接生成相应的最终目标文件(可执行文件或静态库或动态库)

g++ hello.o -o hello
z执行生成的目标文件
./hello
最后出来的结果就是”Hello World!”

q其实上面的步骤,如果想一下子到可执行文件,使用下面的命令:
g++ main.cpp -o main
生成main可执行文件以后,直接运行./main就会出现”Hello World”。
z深入理解:

最难理解的是编译与汇编的区别。这里采用《深入理解计算机系统》的说法。

    预处理阶段:写好的高级语言的程序文本比如hello.c,预处理器根据#开头的命令,修改原始的程序,如#include<stdio.h>,将把系统中的头文件插入到程序文本中,通常是以.i结尾的文件。
    编译阶段:编译器将hello.i文件翻译成文本文件*hello.s,这个是汇编语言程序。高级语言是源程序。所以注意概念之间的区别。汇编语言程序干嘛?每条语句都以标准的文本格式确切描述一条低级机器语言指令。*不同的高级语言翻译的汇编语言相同。
    汇编阶段:汇编器将hello.s翻译成机器语言指令。把这些指令打包成可重定位目标程序,即.o文件。hello.o是一个二进制文件,它的字节码是机器语言指令,不再是字符。前面两个阶段都还有字符。
    链接阶段:比如hello程序调用printf程序,它是每个C编译器都会提供的标准库C的函数。这个函数存在于一个名叫printf.o的单独编译好的目标文件中,这个文件将以某种方式合并到hello.o中。链接器就负责这种合并。得到的是可执行目标文件。

看到一道题目:(其实这个题目不太好)
于是,带着这个理解看2016年的一道命制的习题:
(2016.12)将高级语言源程序转换为机器目标代码文件的程序是(C)
A. 汇编程序
B. 链接程序
C. 编译程序
D. 解释程序

分析:根据上面的描述,这里需要明确的是机器目标代码文件可不可以用来指代汇编程序文件。按照很多文章的解释,这个就是指汇编程序文本。首先,经过汇编程序以后,得到的是可重定位的二进制目标程序,已经不再是含字符的文件了。此外,处理高级程序的一定是预处理程序或编译程序。汇编处理的对象是汇编程序文本,链接处理的是可重定位二进制程序。因此,这里就是在指代编译程序。

额外的一些小总结:

GCC编译器的选项解读

1. 基本选项

-E是只进行预处理选项,不进行编译、汇编、以及连接

-S 编译后停止,不进行会变和连接

-c编译或会汇编文件,但不进行连接

-o file 指定输出文件名

2. 警告选项

-Wall 启用所有警告信息

-Werror 在发生警告时取消编译操作,即将警报看作是错误

-w 禁用所有警告信息

3. 优化选项

-O0:不进行优化处理

-O或-O1:进行基本的优化,这些优化在大所属情况下都会使程序执行的更快

-O2:除了完成-O1级别的优化外,还需要一些其他的调整工作,如处理器指令调度等,只是GNU发布软件的默认优化

-O3:除了完成-O2级别的优化外,还进行循环的展开(这往往会提高执行速度)以及其他的一些预处理器相关的优化工作。

-Os:生成最小的可执行文件,主要用在嵌入式领域。

4. 连接器选项

-IdirectoryGCC的头文件搜索路径中添加新的目录

-LdirectoryGCC的库文件搜索路径中添加一个行的目录

-llibrary 提示连接程序在创建可执行文件时包含指定的库文件

-static 强制使用静态库

-shared 强制使用共享库

5. 其他选项

-xlanguage 指定输入文件的编程语言

-v 显示编译器的版本号

-g 获得有关调试程序的详细信息

-ansi 支持符合ansi彼岸准的c程序
``
g关于编译动态库,静态库的总结:

如何使用g++编译动态库\静态库?如何使用g++连接非标准库和应用程序?

什么是库呢?简单的说库就是一组已经写好了的函数和变量、是经过编译了的代码,为了提高开发的效率和运行的效率而设计的。库可以分为静态库和动态库(共享库)两类,在linux系统中静态库的扩展名为.a,动态库的扩展名是.so。

静态库是在每个程序进行链接的时候将库在目标程序中进行一次拷贝,当目标程序生成的时候,程序可以脱离库文件单独运行,换言之原来的文件即使删除程序还是会正常工作。

共享库可以被多个应用程序共享,实在程序运行的时候进行动态的加载,因此对于每个应用程序来说,即使不再使用某个共享库,也不应该将其删除,因为其他的引用程序可能需要这个库。

  1. 如何生成库

下面演示如何生成静态库和动态库:

生成静态库的过程是先将每个每个原文件进行编译生成中间目标文件,然后利用打包程序,将程序进行一次打包,最后生成静态库文件。以下面的例子说明问题:
j具体过程参见:
http://www.cppblog.com/Roger/archive/2011/11/13/160023.html
“`

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux使用curl进行交叉编译,首先需要安装相关的交叉编译工具链。根据目标平台选择适当的工具链,如ARM、MIPS等。然后,下载curl的源代码包并解压。 进入curl源码目录后,可以配置编译参数。使用./configure命令,通过指定交叉编译工具链的位置和参数,来进行交叉编译的配置。例如: ``` ./configure --host=交叉编译工具链的前缀 ``` 其中,"--host"参数后面跟的是经过交叉编译工具链前缀,如arm-linux-gnueabi、mips-linux-gnu等。这样配置之后,就可以使用交叉编译器来编译curl了。 配置完成后,运行make命令进行编译。编译完成后,即生成了交叉编译后的curl可执行文件。 最后,将生成的可执行文件拷贝到目标平台上进行运行测试即可。 总结起来,通过安装交叉编译工具链、配置编译参数,以及使用make命令进行编译,就可以在Linux下完成curl的交叉编译。 ### 回答2: 在Linux系统下,交叉编译是指在一台主机上用特定工具链编译生成适用于另一种主机架构的可执行程序。对于curl在Linux下的交叉编译,以下是一些步骤: 首先,我们需要设置交叉编译环境。这包括安装交叉编译工具链和交叉编译的目标架构的头文件与库。 然后,我们需要下载curl的源代码。可以从curl的官方网站下载最新版本的源代码。 接下来,我们需要根据交叉编译工具链的要求配置curl的编译选项。这可能涉及到指定目标架构、链接选项、头文件和库的路径等。 然后,我们可以运行configure命令来生成适用于交叉编译环境的Makefile。configure命令会根据主机架构、编译选项等自动配置Makefile。 接着,我们可以运行make命令进行编译。make命令会根据Makefile中的指令来编译生成可执行程序。在编译过程中,可能会出现一些依赖问题需要解决,比如缺少某些库文件。 最后,我们可以运行make install命令将编译生成的可执行程序安装到目标机器中。 需要注意的是,根据交叉编译工具链和目标架构的不同,具体的交叉编译过程可能会有所差异。因此,在进行交叉编译前,建议阅读相关文档或参考其他资源,以便更好地理解和掌握交叉编译的步骤和注意事项。 ### 回答3: 在Linux下进行curl交叉编译,需要以下几个步骤: 1. 安装交叉编译工具链:首先需要在Linux系统中安装适合目标平台的交叉编译工具链。根据目标平台的不同,可以选择不同的工具链,例如gcc、g++等。 2. 下载curl源代码:从curl的官方网站上下载最新的curl源代码包,并解压到本地。 3. 配置交叉编译环境:打开终端,进入解压后的curl源代码目录下,执行以下命令: ``` export CC=交叉编译器路径 export CXX=交叉编译器路径 export AR=交叉编译器路径-ar export RANLIB=交叉编译器路径-ranlib export LD=交叉编译器路径-ld export STRIP=交叉编译器路径-strip export CPPFLAGS="-I交叉编译器路径/include" export LDFLAGS="-L交叉编译器路径/lib" ``` 替换上述命令中的“交叉编译器路径”为实际的交叉编译工具链路径。 4. 配置编译选项:执行以下命令配置编译选项: ``` ./configure --host=目标平台 --prefix=安装路径 ``` 其中,目标平台是指要将curl交叉编译到的目标硬件平台,安装路径是指将编译后的curl安装到的目录。根据实际的需求进行配置。 5. 编译和安装:执行以下命令开始编译和安装: ``` make make install ``` 编译过程可能需要一些时间,等待编译完成后,curl将被安装到指定的安装路径下。 通过以上步骤,我们可以在Linux下成功进行curl的交叉编译。在配置交叉编译环境时,需要注意交叉编译器的选择和路径的配置,确保编译工具链已正确安装,并设置正确的编译选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值