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命令:用于查看程序执行时须要载入的共享库

时间: 2024-12-28 17:24:58

gcc学习(二)[第二版]的相关文章

gcc学习(一)[第二版]

gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C  Compiler),作者为Richard Stallman,是GNU项目的奠基者;现在已经支持多种语言,如C.C++.Java.Pascal.Ada.COBOL语言等 . 2.主要特征: gcc是一个可移植的编译器,支持多种硬件平台,甚至对Don Knuth 设计的 MMIX 这类不常见的计算机都提供了完善的支持 gcc不仅仅是个本地编译器,它还能跨平台交叉编译(在本地编译的程

gdb学习(二)[第二版]

查看运行时数据 print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype "aaa" 打印字符串"aaa"的类型 #ptype array 打印数组array的类型 #ptype main 打印main函数的类型 print array – 查看数组 #p arr1 #p arr1[2] 查看数组arr2第三个元素值 #p &arr1[2] 打印数组元素的地址 #p &arr1 打印数组首地址,与p &arr1

gcc使用解析(第二版)

gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C  Compiler),现在已经支持多种语言了,如C.C++.Java.Pascal.Ada.COBOL语言等.[gcc编译器的作者是Richard Stallman,是GNU项目的奠基者] 2.主要特征: gcc是一个可移植的编译器,支持多种硬件平台,甚至对Don Knuth 设计的 MMIX 这类不常见的计算机都提供了完善的支持 gcc不仅仅是个本地编译器,它还能跨平台交叉编译

Makefile学习(三)[第二版]

make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当前目录下的文件 例如:src=$(wildcard *.c) #匹配当前目录下所有的.c文件 2)$(patsubst PATTERN,REPLACEMENT,TEXT) #模式替换函数 例如:$(patsubst %.c,%.o,$src) #等价于$(src:%.c=%.o)[常用] 3)she

Makefile学习(一)[第二版]

简介 1)make:利用 make 工具可以自动完成编译工作.这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件[make通过比对相应的.c文件与.o文件的时间];如果某个头文件被修改了,则重新编译所有包含该头文件的源文件.利用这种自动编译可大大简化开发工作,避免不必要的重新编译. 2)Mackfile:make工具通过一个称为 Mackfile 的文件来完成并自动维护编译工作.Mackfile文件描述了整个工程的编译.连接等规则. Mackfile基本规则 Target ...:

学习bash第二版 学习笔记 1 —— bash的简介、检测和安装

shell 区别于内核 是一款命令解析程序. Bourne Again shell (BASH), 创建用于GNU项目. GNU项目由Free Software Foundation(FSF)的Richard Stallman 始创,用于创建一个UNIX兼容的操作系统, 并使用该免费的发布版本替代所有的商业UNIX版本. ?? 你可能不能马上用bash.你的系统管理员可能将你的账号设置为使用系统上的 "标准" shell,你甚至不知道有没有其他shell可用. ?? 键入 echo $

《lua程序设计(第二版)》学习笔记(二)

直接上代码 1: -- 第2章 类型与值 2: -- 动态类型的语言,每个值都携带自身类型信息 3: print("类型打印,每个值都携带自身类型"); 4: print(type("Hello world")); -- string 完全采用8位编码,字符可以具有任何数值编码,可以将任意二进制数据存储到字符串中 5: --[[ 6: string是不可变值,不能像C一样修改一个字符创中某个字符,而是应该 7: 创建一个新的字符串; 8: 和其他对象一样,都是自动内

细读《从问题到程序(第二版)》第一章学习总结

李磊20199131 细读<从问题到程序(第二版)>第一章学习总结 教材学习内容总结 编程需要掌握的工作方式 我们需要从问题的要求出发,从高层开始设计程序,并逐步分解程序功能.当程序所需的功能分解到一定的程序后,就可以借助程序语言的结构,描述程序工作中的细节步骤了. 高级语言中两种基本的实现技术-编译和解释 编译:采用编译的方式实现高级语言:针对具体语言开发出一个翻译软件,它能将通过高级语言编写出来的程序翻译成能被计算机所识别的机器语言 解释:针对具体语言开发出一个解释软件,它能将写好的程序学

python基础学习05(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #dict{键:值} #哈希 #注:字典是无顺序的,所以你懂的 #创建与赋值 dict1={} dict2={'name':'apply','avg':24,'sex':'man'} print dict1,dict2