gcc学习笔记

原创 2016年08月29日 00:09:03

由源代码到二进制可执行文件的步骤

预处理 头进行展开,宏展开 生成.i文件
编译 对应语言的编译器 生成。s
汇编 汇编器 生成 .o 偏移地址是从0开始
链接 重新定位地址,链接其他库

gcc 选项及演示

预处理
gcc -E hello.c -o hello.i //输出预处理后的文件
编译
gcc -S hello.i -o hello.s //输出汇编结果
汇编
gcc -c hello.s -o hello.o //输出二进制文件
链接
gcc hello.s -o hello //输出链接后的二进制,没有选项

-Wall 警告
-Idir 加入头文件搜索路径
-Ldir 加入索索库的目录
-llib 链接lib库
-g 在目标文件中加入调试信息,如果没有加盖选择是木能调试的

选项先后顺序可以调换

每次都尽量要加 -Wall选项

演示main调用hello_fn.c中的函数的编译过程

hello_fn.h
hello_fn.c
main.c

gcc -Wall hellow_fn.c main.c -o main
gcc -Wall -c hello_fn.c -o hello

gcc -Wall hello.o main.o -o main
单独编译的,如果更改其中一只更改了,只需要编译其中修改,重新链接一下

静态库和共享库之间的区别

静态库( .a文件),在链接阶段把二进制文件链接到可执行文件中。运行时不再需要静态库

动态库(共享库 .so .sa文件) 程序在运行的时候才会去链接动态库,多个程序共享动态库代码(节省了动态库的指令内存区)。

库的搜索路径

//-L 是在指定路径下搜索该库目录。
//-I 存放头文件的位置

  1. -L -I 从左到右搜
  2. C_INCLUDE_PATH lIBRARY_PATH 环境变量的值对应位置
    配置环境变量
    vi ~/bash_profile
    export LIBRARY_PATH = /home/hzz/code:/home/xiaoming/work
    export CPP_INCLUDE =/home/hzz/code/cppinclude
    export C_INCLUDE=/home/hzz/code/cinclude
    //注意与windows的不同,用: 分割
    3.系统默认路径
    /usr/include
    /usr/local/include
    /usr/lib
    /usr/local/lib
    (注意这里的 usr 为Unix System Resource 的意思)

修改完执行一遍该配置文件。

找共享库
//找共享库的位置修改方式
1.配置环境变量
vi ~/bash_profile
export LD_LIBRARY_PATH =/home/hzz/code/lib

2.配置 /etc/ld/ld.so.conf
然后用ldconfig 命令更新该文件

ldd main 可以看可执行程序包含哪些些库

演示生成静态库,并使用静态库

现有文件如下:
hello_fn.h
hello_fn.c
生成静态库
mian.c

gcc -c hello.c //输出hello.o文件
gcc -c main.c //输出main.o

可将多个.o文件,打包成.a文件
ar rcs libhello.a hello_fn.o //打包成.a 静态库
gcc -Wall main.o libhello.a -o main //链接进main二进制文件

另外一种使用库的方式(这种可能更常用)
gcc -Wall -L . main.o -o main -lhello

演示使用动态库

动态库库名规则libxxx.so

(fPIC 全拼为 position independent code)
gcc -shared -fPIC hello.o -o libhello.so

//使用
gcc -Wall -L . main.o -o main -lhello

动态库静态库混合使用

假设当前目录下有两个同名的hllo.a hello.so 库

gcc -L . main.o -o main -lhello //优先使用动态库
gcc -L . main.o -o main -static -lhello

当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式。这时需要作用-Wl的方式:

gcc test.cpp -L. -Wl,-Bstatic -ltestlib -Wl,-Bdynamic -ltestdll
另外还要注意系统的运行库使用动态连接的方式,所以当动态库在静态库前面连接时,必须在命令行最后使用动态连接的命令才能正常连接 如:

gcc test.cpp -L. -Wl,-Bdynamic -ltestdll -Wl,-Bstatic -ltestlib -Wl,-Bdynamic

最后的-Wl,-Bdynamic表示将缺省库链接模式恢复成动态链接。

查看库的导出函数
nm *.so
readelf -a so
暂时了解有用了在细查参数吧。

版权声明:本文为博主原创文章,未经博主允许不得转载。

GCC-3.4.6源代码学习笔记(1)

大约4年前,我加入了GDNT - 北电网络在中国的合资企业,参与3G UMTS无线接入网的研发工作。与GCC有了第一次亲密的接触(之前使用的是MS的VC)。彼时,北电在其诸如,UMTS、CDMA、及自...
  • wuhui_gdnt
  • wuhui_gdnt
  • 2010年02月21日 14:43
  • 6583

Vulkan教程--Introduction

这是一篇告诉你如何使用Vulkan 图形(Graphics)和计算(Compute)API 基础的教程。Vulkan是一个来自 Khronos group的新的图形API,它使你能更好的描述你的应用的...
  • lbknxy
  • lbknxy
  • 2016年08月31日 14:46
  • 685

Gcc学习笔记

1. 编译C文件生成可执行文件(后续例子如无特殊说明均为C文件): gcc helloWorld.c 2. 编译C++文件生成可执行文件(用g++): g++ helloWorld.cpp ...
  • zixiaomuwu
  • zixiaomuwu
  • 2017年03月13日 22:18
  • 251

gcc学习笔记

1、连接头文件 gcc -I /usr/openwim/include fred.c 使用 -I 标志来包含保存在子目录或者非标准位置的中的头文件。例如上边语句指示编译器不仅在标准位置,也在 /usr...
  • sin0803
  • sin0803
  • 2015年02月04日 09:19
  • 291

GCC学习笔记

54powerman@163.comhttp://blog.csdn.net/54powerman1 设置GCC命令行使用环境变量:SET GCC_HOME=E:/MinGWSET PATH=%PAT...
  • 54powerman
  • 54powerman
  • 2007年04月29日 18:00
  • 2533

GCC 学习笔记

1、GCC的编译和安装2、预处理    #define 可以支持不定数量的参数。    例子如下:    #define err(...) fprintf(stderr,__VA_ARGS__)   ...
  • yrj
  • yrj
  • 2005年09月29日 21:43
  • 9913

RT-Thread 学习笔记(一)---配置RT-Thread开发环境

一个偶然机会接触到了一个陌生的名字---RT-Tread,想一探究竟,从它的手册中发现这个陌生的嵌入式操作系统有着许多优秀的表现,于是下决心学习研究下。下面记录了RT-Thread的学习过程,不妥之处...
  • aping_cs_dn
  • aping_cs_dn
  • 2014年07月30日 18:42
  • 4254

gcc常用参数解析【学习笔记】

gcc 常用参数解析 小生正在学习linux c,so将gcc常用参数总结一下,权当学习笔记,也希望对有用的菜鸟有帮助,有不对的地方希望指正。 第一阶段:-o,-g,-c,-W...
  • wangjinruifly
  • wangjinruifly
  • 2011年11月14日 18:27
  • 159

GCC连接脚本学习笔记

连接脚本将我整整蒙了1天零一个上午,做了很多实验,看了人家不少例子代码 勉强能驾驭了,让linker按照我想要的来处理,做个笔记。 1,什么叫输入段,什么叫输出段 不知道怎么回事,我对GCC...
  • cat_lover
  • cat_lover
  • 2016年02月24日 09:51
  • 1506

gcc/g++学习笔记

看到一个兄弟的博客,其中对g++后面参数-l的学习非常好,收藏起来,以备后面学习。 http://hi.baidu.com/breezedeus/blog/item/e534ea135b527f8a...
  • hoho568
  • hoho568
  • 2012年03月05日 17:13
  • 549
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gcc学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)