头文件与库文件

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学习(二)[第二版]的更多相关文章

  1. Makefile学习(二)[第二版]

    复杂实例 #演示样例1:在上一个演示样例的基础上再添加一个可运行文件03test[改动之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = ...

  2. gcc学习(一)[第二版]

    gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C  Compiler),作者为Richard Stallman,是GNU项目的奠基者 ...

  3. gdb学习(二)[第二版]

    查看运行时数据 print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype "aaa" 打印字符串"aaa"的类型 #ptype  ...

  4. TensorFlow 深度学习中文第二版·翻译完成

    原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...

  5. python基础学习二——第二天

    对于python而言,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等特性 一.int 首先我们来查看一下int包含了哪些函数 # python3.x dir(int) # ['__a ...

  6. Makefile学习(一)[第二版]

    简单介绍 1)make:利用 make 工具能够自己主动完毕编译工作.这些工作包含:假设仅改动了某几个源文件,则仅仅又一次编译这几个源文件[make通过比对对应的.c文件与.o文件的时间];假设某个头 ...

  7. gdb学习(一)[第二版]

    概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...

  8. Makefile学习(三)[第二版]

    make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当 ...

  9. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...

随机推荐

  1. Linux 下的一个全新的性能测量和调式诊断工具 Systemtap, 第 2 部分: DTrace

    DTrace的原理本系列文章详细地介绍了一个 Linux 下的全新的调式.诊断和性能测量工具 Systemtap 和它所依赖的基础 kprobe 以及促使开发该工具的先驱 DTrace 并给出实际使用 ...

  2. Java格式化时间

    Java格式化时间 将秒或者毫秒值格式化成指定格式的时间 效果图 工具类 工具类里我只列出了一种格式的格式化方式,可以根据自己的需求,修改"yyyy-MM-dd hh:mm:ss" ...

  3. Xcode Organizational Identifiers

    操作系统(不管是iOS或是OS X)使用bundle标识去唯一标识你的应用.Bundle标识由一个组织id和你App的名字组成. 一般的,组织id是你域名的反转.如果你的域名是example.com那 ...

  4. JSP简单隔行变色和日期格式化

    以前好像在找,都没找到简单点的,所以后面就自己写了一个,感觉超级简单又好理解,分享给大家 <%@ page language="java" import="java ...

  5. Struts 1 之<bean>标签库

    <bean:write>标签 <bean:write>能输出request.session.application.page四个域中能访问到的变量,与EL表达式不同的是,如果变 ...

  6. Linux网络和进程管理

     1) 计算机网络是通过外围的设备和连接,将分布在相同或不同区域的多台计算机 连接在一起所形成的集合.网络中的计算机实现彼此间互相通信,并且可以共 同使用硬件.软件和数据资源,实现资源共享.Lin ...

  7. Xcode中的变量模板(variable template)的用法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 你可能经常会写一些小的代码片段,里面自然少不了一些关键的变量. ...

  8. 5.1、Android Studio用Logcat编写和查看日志

    Android Studio在Android Monitor中包含了一个logcat的tab,可以打印系统事件,比如垃圾回收发生时,实时打印应用消息. 为了显示需要的信息,你可以创建过滤器,更改需要显 ...

  9. [maven学习笔记]第一节,认识maven,搭建maven开发环境,写第一个HelloWorld

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40142771 maven官网:http://maven.apache.org/ 学习视 ...

  10. Tomcat集群应用部署的实现机制

    集群应用部署是一个很重要的应用场景,设想一下如果没有集群应用部署功能,每当我们发布应用时都要登陆每台机器对每个tomcat实例进行部署,这些工作量都是繁杂且重复的,而对于进步青年的程序员来说是不能容忍 ...