linux-gcc简要知识点 **
交叉编译
使用不同的交叉编译工具链编译源码,能在不同框架的处理器上运行。
如:
- X86
gcc -o hello hello.c
上述命令编译出来的文件能在 X86 上运行,因为 gcc 编译工具链是给PC编译的。
- ARM
arm-linux-gnueabihf-gcc -o hello hello.c
上述命令编译出来的文件能在 ARM 上运行。
简要知识点 **
- 头文件的作用:
- 声明(declare)
- c文件的作用
- 定义、实现(define)
- 头文件寻址
- 默认路径:编译器中的 include 目录
- 可指定:
#include "xx/xx.h":由当前文件路径算起- 编译时用 "-I" 选项指定
- c文件内的外部函数在哪里,如 printf 函数:
- 库:
- 默认路径:编译器中的 lib 目录
- 可指定:
- 编译时用 "-I" 指定库文件
- 编译时用 "-L"指定库目录
- 库:
- 怎么确定交叉编译器中头文件的默认路径?
- 进入交叉编译器的目录,使用find命令直接查找,如
- 执行"find -name "stdio.h""
- 进入交叉编译器的目录,使用find命令直接查找,如
- 怎么确定交叉编译器中库的默认路径?
- 进入交叉编译器的目录,执行"find -name lib",进去看看, 有很多 .so 文件的里面就是要找的路径。
一些概念
- 交叉编译工具链中的 include 目录和lib 目录:
- include 存放头文件
- 这些头文件一般是函数声明,还有一些变量声明,名字空间,宏定义,typedef 等等
- lib 存放obj文件的(对gcc来说为.o)
- 也就是说,一些库文件,人家不想让你看见源代码,只是给了你中间生成的obj文件
- include 存放头文件
GCC编译器
PC机上的编译工具链有 gcc、ld、objcopy、objdump等等,他们编译出来的程序能在 X86 平台上运行。
要使编译出来的的程序能在 ARM 上运行,就必须使用交叉编译工具链 xxx-gcc、xxx-ld等(不同版本的编译器的前缀不一样,如 arm-linux-gcc)。
GCC简要使用
GCC编译过程 **
一个C/C++文件要经过预处理、编译、汇编、链接等4个步骤才能变成一个可执行文件。(日常交流中用 编译 统称以上四大步骤)
- 预处理,在预处理过程中,对源代码文件中的文件包含(include)、 预编译语句(如宏定义define等)进行展开,生成.i文件。 可理解为把头文件的代码、宏之类的内容转换成更纯粹的C代码,不过生成的文件以.i为后缀。
- 编译,把预处理后的.i文件通过编译成为汇编语言,生成.s文件,即把代码从C语言转换成汇编语言,这是GCC编译器完成的工作。
- 汇编,将汇编语言文件经过汇编,生成目标文件.o文件,每一个源文件都对应一个目标文件。即把汇编语言的代码转换成机器码,这是as汇编器完成的工作。
- 链接,最后将每个源文件对应的.o文件链接起来,就生成一个可执行程序文件,这是链接器ld完成的工作。
- 链接分为两种
- 动态链接
- GCC编译时的默认选项。
- 指应用程序运行时才去加载外部的代码库。
- 静态链接
- 链接时使用选项
–static - 它在编译阶段就会把所有用到的库打包到自己的可执行程序中。
- 链接时使用选项
- 动态链接
- 链接分为两种

常用的编译选项
| 选项 | 描述 |
|---|---|
| -E | 预处理,开发过程中想快速确定某个宏可以使用 “-E -dM” |
| -c | 做了预处理、编译、汇编,但是没做链接 |
| -o | 指定输出文件 |
| -I | 指定头文件目录(大写 i) |
| -l | 指定链接到哪一个库文件(小写 L) |
| -L | 指定链接时库文件目录 |
编译多个文件
- 一起编译、链接:
如:
gcc -o hello main.c hello.c
- 分开编译,统一链接:
如:
gcc -c -o main.o main.c
gcc -c -o hello.o hello.c
gcc -o hello main.o hello.o
制作、使用动态库
- 制作、编译:
gcc -c -o main.o main.c
gcc -c -o hello.o hello.c
gcc -shared -o libhello.so hello.o hello1.o // (*可以使用多个 .o 生成一个动态库*)
gcc -o hello main.o -lhello -L <目录路径> // (*该路径为 libhello.so 文件所在目录*)
- 运行
- 把 libhello.so 放到PC或板子的/lib目录下,然后运行test程序。
- 如果不想把 libhello.so 放到/lib, 也可以放到自己新建的某个目录,如 /mylib,然后执行:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a
./hello
(其实就是修改 库的环境变量。)
制作、使用静态库
gcc -c -o main.o main.c
gcc -c -o hello.o hello.c
ar crs libhello.a hello.o hello1.o // (*可以使用多个 .o 生成一个静态库*)
gcc -o hello main.o libhello.a // (*如果 .a 不在当前目录下,需要指定它的绝对路径或相对路径*)
注意:不需要把 hello.a 静态库文件拉到板子上
很有用的选项
gcc -E main.c // 查看预处理结果,比如头文件是哪个
gcc -E -dM main.c > h.txt // 把所有的宏展开,保存到 h.txt 文件里
gcc -Wp,-MD,yl.dep -c -c -o main.o main.c // 生成依赖文件 yl.dep,后面 Makefile 会用到
参考
- 韦东山
- 野火
- gcc-gun
- 建议:想看库文件源码时,如printf、malloc之类的,可以进入glibc的官网地址学习
linux-gcc简要知识点 **的更多相关文章
- linux gcc 编译动态类库(.so)和静态类库(.a)
linux gcc 编译动态类库(.so)和静态类库(.a) 我的编译环境 ubuntu desktop 16.04 一:测试代码 测试有3个文件:AB.h,AB.c,test.c //AB.h vo ...
- linux gcc loudong
五事九思 (大连Linux主机维护) 大连linux维护qq群:287800525 首页 日志 相册 音乐 收藏 博友 关于我 日志 spcark_0.0.3_i386.src.t ...
- linux gcc++漏洞:普通用户获得root权限
linux gcc++漏洞:普通用户获得root权限 2012-02-06 10:22:38| 分类: linux安全|举报|字号 订阅 经我测试在RHEL5 / CentOS5 / F ...
- Ubuntu12.4 64位 安装 arm linux gcc 4.3.2
一.下载arm linux gcc 4.3.2 http://pan.baidu.com/share/link?shareid=1575352696&uk=2754759285&fid ...
- linux gcc 区分32位或64位编译 && 请问arm存储,是以小端格式还是以大端格式?
linux gcc 区分32位或64位编译 Linux系统下程序如何区分是64位系统还是32位系统 经过对include的翻查,最后确定gcc以__i386__来 进行32位编码,而以__x86_ ...
- 深入剖析 linux GCC 4.4 的 STL string
转自: 深入剖析 linux GCC 4.4 的 STL string 本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Wri ...
- Linux gcc中的LIBRARY_PATH 和 LD_LIBRARY_PATH
1. GNU 上关于LIBRARY_PATH的说明: LIBRARY_PATH The value of LIBRARY_PATH is a colon-separated list of direc ...
- Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH的区别
昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错.链接命令大概是这样的: [root@typecodes tcpmsg]# g ...
- Linux GCC lib库相互引用,互相依赖(交叉引用)链接解决办法
Linux GCC中,如果lib a依赖b,b又依赖a,链接的时候无论a放在前,还是b放在前,都会提示unrefrence. 解决办法就是: 链接的时候a链接两次,即: -la -lb -la
随机推荐
- 036 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 03 嵌套if结构
036 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 03 嵌套if结构 本文知识点:Java中的嵌套if结构 什么是嵌套if结构? 概念: 嵌套if结构 ...
- http协议和chrome浏览器
http协议和Chrome抓包工具 什么是http和https协议: HTTP协议:全称是HyperText Transfer Protocol,中文意思是超文本传输协议,是一种发布和接收HTML页面 ...
- Dockerfile常用指令及使用
Dockerfile常用指令及使用 1. dockerfile介绍 2. Dockerfile常用指令 指令 描述 FROM 构建新镜像是基于哪个镜像 MAINTAINER 进行维护者姓名或邮箱地址 ...
- NB 的开源项目遍地开花——GitHub 热点速览 Vol.41
作者:HelloGitHub-小鱼干 本周的 GitHub 热点速览的关键词便是 nb,也是本周特推之一的项目名字,这个功能如名字一般 nb 的项目是一个脚本,帮你处理笔记.书签.归档和知识库应用程序 ...
- markdown的基本使用
1.什么是markdown? markdown是一种轻量级的标记语言 可以转换为html/xhtml和其它格式 可读.直观.学习成本低 当你学会使用markdown编写文档时,你会感觉自己发现了一个新 ...
- [源码阅读] 阿里SOFA服务注册中心MetaServer(3)
[源码阅读] 阿里SOFA服务注册中心MetaServer(3) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 0x00 摘要 0x01 概念 1.1 分布式一致性 1.2 ...
- MeteoInfoLab脚本示例:站点数据绘制等值线
站点数据绘制等值线需要首先将站点数据插值为格点数据,MeteoInfo中提供了反距离权法(IDW)和cressman两个方法,其中IDW方法可以有插值半径的选项.这里示例读取一个MICAPS第一类数据 ...
- C语言和单片机C语言为什么会有差异?虽不同但理同!
许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学的C语言有差异呢? 今天小编就来梳理我们平时所学的C语言与单片机C语言的有什么样的不同. 单片机c语言比 ...
- 如果你想or即将成为一名程序员,那你需要知道这些东西!上岗须知~
前两天公司学院的同学给我看了一下即将入职的应届生的数量,真是不少.感慨一下,一批新人即将到来,而自己又老去了一岁.码农是一个必将终身学习的职业.而相关的知识越来越多了.接下来该学什么?接下来该干什么? ...
- PHP之Trait详解 转
php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性 用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Tra ...