Linux下GCC相关知识点

摘要:

总结GCC的具体使用,动态库静态库的相关问题

参考资料:

《Linux网络编程》  ISBN:9787302207177  p19

1 GCC简介

GCC是Linux下的编译工具集,是GNU Compiler Collection的缩写,包含gcc,g++等编译器,还有工具集如ar,nm

GCC工具集不仅能编译C/C++,还能编译其他语言如Objective-C

GCC还能进行交叉编译

文件扩展名含义:

默认路径:

2 编译步骤

预编译:将头文件包含进源代码,并对一些宏进行替换

编译和优化:编程汇编语言

汇编:汇编->机器语言,这一步生成目标文件.o

链接:目标文件通常解析了文件内部的变量和函数,对于引用的函数和变量还没有解析,需要将其他已经编写好的目标文件引进来,通常引用的目标是库

3 用GCC编译程序

常用选项

-c  生成目标文件

-o  指定生成文件名称,不指定生成默认文件名

-E   仅作预处理,不进行编译、汇编和链接

-S   仅编译到汇编语言,不进行汇编和链接

-llibrary   进行链接时搜索名为library的库

-Ldir  把dir加入到搜索库文件的路径列表中

-Idir  把dir加入到搜索头文件的路径列表中

-static  仅选用静态程序库进行链接,如果一个目录中静态库和动态库都存在,则仅选用静态库

1. 将源文件直接编译成可执行文件

gcc hello.c    //生成hello.out

gcc -o hello hello.c    //指定生成的可执行文件名为hello

2. 将源文件先编译成目标文件,再编译成可执行文件

gcc -c hello.c    //生成hell.o

gcc -o hello hello.o        //链接,生成可执行文件hello

4 静态和共享(动态)库

什么是库
在windows平台和linux平台下都大量存在着库。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
由于windows和linux的平台不同(主要是编译器、汇编器和连接器的不同),因此二者库的二进制是不兼容的。

库的种类
linux下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

库存在的意义
库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

注意

库名是不包含函数库和扩展名的字符串

如果系统的搜索路径下存在静态库和动态库,默认情况下会链接动态库,如果要强制链接静态库,需要加上-static选项

无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件

静态链接库

先生成目标文件,在用ar -cr生成

ar -cr libstr.a string.o          //生成静态库

gcc -o test main.c libstr.a    //使用静态库

动态链接库

动态链接库有别名(soname)、真名、链接名,别名:lib库名.so,真名是在别名基础上加上小版本号。链接名是程序在链接时使用的库名。一般来说使用动态链接库总是将库文件放到某个目录下,然后用软链接生成别名

“PIC”命令行标记告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该消息代码的应用程序会将它连接到哪一段内存地址空间。这样编译出的hello.o可以被用于建立共享链接库。建立共享链接库只需要用GCC的”-shared”标记即可。

gcc -shared -fPIC -o libmyhello.so hello.o

为了让新增加的动态链接库能够被系统共享,需要运行动态链接库管理命令ldconfig。ldconfig的作用是在系统默认的搜索路径,和动态链接库配置文件中所列出的目录里搜索动态链接库,创建动态链接装入程序需要的链接和缓存文件,搜索完毕后将结果写入缓存文件/etc/ld.so.cache中

环境变量

LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径

LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

静态库链接时搜索路径顺序:

1. ld会去找GCC命令中的参数-L

2. 再找gcc的环境变量LIBRARY_PATH

3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

动态链接时、执行时搜索路径顺序:

1. 编译目标代码时指定的动态库搜索路径;

2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4. 默认的动态库搜索路径/lib;

5. 默认的动态库搜索路径/usr/lib。

时间: 2024-08-08 22:07:47

Linux下GCC相关知识点的相关文章

Linux下gcc编译生成动态链接库*.so文件并调用它 是转载的

动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助.1.动态库的编译 下面通过一个例子来介绍如何生成一个动态库.这里有一个头文件:so_test.h,三个.c文件:test_a.c.test_b.c.test_c.c,我们将这几个文件编译成一个动态库:libtest.so. //so_test.h:#include "stdio.h"

基于嵌入式Linux下GCC编译器__sync_sub_and_fetch_4错误的解决心得

******************************************************************************************************************************************************* 作者:EasyWave                                                                                      

linux 下gcc生成intel汇编

留作备忘: gcc -S -masm=intel xxxx.c 生成elf可执行文件: gcc -o xxx xxxx.s linux 下gcc生成intel汇编,码迷,mamicode.com

linux下gcc升级

由于最近公司老大安排对gcc进行升级,所以就整理下这篇文档,希望对有些盆友有些许帮助 1 安装gmp4.3.2 tar jxvf gmp-4.3.2.tar.bz2 mkdir /usr/local/gmp-4.3.2 cd /usr/local/gmp-4.3.2 /opt/gmp-4.3.2/configure --prefix=/usr/local/gmp-4.3.2 make  && make install 2 安装mpfr2.4.2 tar jxvf mpfr2.4.2.tar

linux下网卡相关查看设置

查整机硬件信息命令dmesg 查看网卡设备相关dmesg | grep eth 查看网卡eth0信息dmesg | grep eth0 使用ethtool命令查看指定网卡信息ethtool eth0 使用 mii-tool命令查看指定网卡情况mii-tool -v eth1 为了使用lspci命令需要安装以下软件包yum -y install pciutils 查看pci接口硬件信息lspci 在linux的proc文件系统中,通过查看/proc/net/dev文件可以得到每个网络接口的吞吐量c

Linux下gcc编译控制动态库导出函数小结

Linux下gcc编译控制动态库导出函数小结 来源 https://www.cnblogs.com/lidabo/p/5703890.html 根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility("hidden"))) 就是说将不公开的函数都加上这个属性,没加的就是可见的 2. gcc 在链接时设置 -fvisibility=hidden,则不加 v

整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题

分类: MakeFile/Make/GCC/LD2010-11-20 23:15 535人阅读 评论(0) 收藏 举报 转者的话: 本文详细介绍了gcc 编译时 搜索头文件的路径以及方式, 编译时寻找lib库的方式, 以及运行时加载库的寻找方式!!!非常之经典啊!以后有新的知识都汇总到这里来了! 在交叉编译的时候我们需要用到其他的库,在config时候可以通过“-I”来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法. 看下文的红色部分. 有大量的环境变量可供设置以影响 G

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

Linux下gcc编译生成动态链接库*.so文件并调用它

动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助.1.动态库的编译 下面通过一个例子来介绍如何生成一个动态库.这里有一个头文件:so_test.h,三个.c文件:test_a.c.test_b.c.test_c.c,我们将这几个文件编译成一个动态库:libtest.so. //so_test.h:#include "stdio.h"