gcc学习(二)[第二版]
头文件与库文件
1、概要
在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明。
库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库)和数据库访问例程(dbm库)等。
2、使用库的优点:
1)模块化开发
2)可重用性
3)可维护性
3、头文件与库文件的位置
/usr/include及其子目录底下的include文件夹
/usr/local/include及其子目录底下的include文件夹
/usr/lib
/usr/local/lib
/lib
4、使用外部库【-i选项】
//例程
#include <math.h>
#include <stdio.h>
int main()
{
double ans = pow(2.0,3.0);
printf("pow(%lf,%lf) = %lf\n",2.0,3.0,ans);
return 0;
}
编译:
gcc -Wall calc.c -o calc -lm
#-lm表示要链接libm.so或者libm.a库文件
静态库与共享库
1、概要
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库,静态库占用磁盘空间较大。
共享库(.so/.sa):程序在运行的时候才去链接共享库的代码,多个程序可共享使用库的代码。[最近的Linux[CentOS 6.4]版本在/usr以及/lib目录下已经找不到.a文件的踪影了]
2、共享库的优点:
一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该共享库中复制到内存中,这个过程称为动态链接(dynamic linking)
共享库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份共享库被要用到该库的所有进程共用,节省了内存和磁盘空间。
生成静态库
-可以简单的认为将多个.o文件打包到一起,就生成了静态库
1)gcc -c hello_fn.c
#同gcc -Wall -c hello_fn.c -o hello_fn.o
2)ar rcs libhello.a hello_fn.o search.o
#arar是gnu归档工具,rcs表示(replace and create),相当于将将.o文件打包成为.a文件,并且.o文件可以有多个
3)gcc -Wall main.c libhello.a -o main
#将各个模块编译,链接生成可执行文件【方式一】
4)gcc -Wall -L. main.c -o main -lhello
#-L.表示在当前目录搜索库文件,-lhello[省略的lib],此时即使删除静态库libhello.a也可运行main文件【方式二】
库的搜索路径
1)从左到右搜索-I -L指定的目录。
2)由环境变量指定的目录
可以定义C_INCLUDE_PATH/CPP_INCLUDE_PATH(头文件搜索路径)、LIBRARY_PATH(库文件搜索路径)保存在~/.bash_profile中,另在Ubuntu系统中,也可以将这些定义存放在~/.bashrc中
3)由系统指定的目录:/usr/include,/usr/lib等
生成共享库
gcc -shared -fPIC hello_fn.o -o hello_fn.so
说明:
1)shared表示生成共享库
2)-fPIC表示生成位置无关码(Position Independent Code)
3)库的命名规则:libXXX.so[.版本号]
使用共享库
1)gcc main.o -o main –L. -lhello
#该命令与使用静态库的命令相同,但是,在共享库与静态库共存的情况下,优先使用共享库
l:链接共享库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径.
2)运行共享库
法1)拷贝.so文件到系统共享库路径下,一般指/usr/lib
法2)在~/.bash_profile文件中,配置LD_LIBRARY_PATH变量
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
. ~/.bash_profile
法3)配置/etc/ld.so.conf,配置完成后调用ldconfig更新ld.so.cache
3)ldd命令:用于查看程序运行时需要加载的共享库
gcc学习(二)[第二版]的更多相关文章
- Makefile学习(二)[第二版]
复杂实例 #演示样例1:在上一个演示样例的基础上再添加一个可运行文件03test[改动之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = ...
- gcc学习(一)[第二版]
gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C Compiler),作者为Richard Stallman,是GNU项目的奠基者 ...
- gdb学习(二)[第二版]
查看运行时数据 print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype "aaa" 打印字符串"aaa"的类型 #ptype ...
- TensorFlow 深度学习中文第二版·翻译完成
原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...
- python基础学习二——第二天
对于python而言,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等特性 一.int 首先我们来查看一下int包含了哪些函数 # python3.x dir(int) # ['__a ...
- Makefile学习(一)[第二版]
简单介绍 1)make:利用 make 工具能够自己主动完毕编译工作.这些工作包含:假设仅改动了某几个源文件,则仅仅又一次编译这几个源文件[make通过比对对应的.c文件与.o文件的时间];假设某个头 ...
- gdb学习(一)[第二版]
概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...
- Makefile学习(三)[第二版]
make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当 ...
- 《Java程序设计与数据结构教程(第二版)》学习指导
<Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...
随机推荐
- Twitter 架构优化之路--Twitter是如何做到每秒处理3000张图片的
如今,Twitter每秒可以创建并保存3000张(20GB)的图片.2015年,Twitter甚至从对媒体存储策略的优化中节省出了600万美元. 但并非一开始就是这样的,2012年Twitter还主要 ...
- Hive的HQL语句及数据倾斜解决方案
[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/51675005 作者: 朱培 ID ...
- 【Unity Shader】Unity Chan的卡通材质
写在前面 时隔两个月我终于来更新博客了,之前一直在学东西,做一些项目,感觉没什么可以分享的就一直没写.本来之前打算写云彩渲染或是Compute Shader的,觉得时间比较长所以打算先写个简单的. 今 ...
- MS Office2016留下的坑
背景 问题源自论坛用户反馈,他用管家有几年了,之前使用IE都很正常,没有任何问题,但是最近突然发现,启动IE时,就会出现系统错误提示:无法启动此程序,因为计算机中丢失 api-ms-win-core- ...
- RxJava(三) flatMap操作符用法详解
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51532776 本文出自:[余志强的博客] flatMap操作符的作用 ...
- PGM:有向图模型:贝叶斯网络
http://blog.csdn.net/pipisorry/article/details/52489270 为什么用贝叶斯网络 联合分布的显式表示 Note: n个变量的联合分布,每个x对应两个值 ...
- Latex居中
居中文本 环境:\begin{center} 第一行\\第二行\\...第n行 \end{center}.可以用\\[长度]来插入可以省略的额外行间距.在一个环境内部,可以用命令\centering来 ...
- testng的使用
TestNG教程 TestNG是一个测试框架,其灵感来自JUnit和NUnit,但同时引入了一些新的功能,使其功能更强大,使用更方便. TestNG设计涵盖所有类型的测试:单元,功能,端到端,集成等, ...
- 【移动开发】binder阻塞/非阻塞与单向/双向的问题
The client thread calling transact is blocked by default until onTransact has finishedexecuting on t ...
- 从嵌入式linux到android应用开发
时间过得很快,转眼之间已经到新公司一个月了.虽然学到了一些移动开发的知识,但是觉得离我的目标还很远,完全没能达到我想要的水平.以前产品都是自己主导的,需要完成什么,计划什么也是自己主导,现在得从头 ...