GCC基础知识3

来源:互联网 发布:js数字转为汉字 编辑:程序博客网 时间:2024/06/03 13:45

外部库 -l
gcc编译的常用选项
-I[dir]:将dir目录加入搜索头文件的目录路径
-L[dir]:将dir目录加入搜索库的目录路径
-l[lib]:链接lib库

linux常用头文件和库的位置
/usr/include及其子目录底下的include文件夹 .h文件
/usr/local/include及其子目录底下的include文件夹 .h文件
/usr/lib 为动态库和共享库.a .so文件
/usr/local/lib .o .so文件

静态库:
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库;动态库(.so或.sa):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码。生成可执行程序后,删掉静态库后,不会影响,因为静态库是链接到可执行文件中了
共享库:一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码;在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该共享库中复制到内存中,这个过程称为动态链接(dynamic linking);共享库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份共享库被要用到该库的所有进程共用,节省了内存和磁盘空间。
静态库生成:库可以认为是.o文件的归档
先生成.o文件,只编译不链接
gcc -Wall -c hello_fn.c -o hello_fn.o
ar是归档文件工具,rcs(replace create save)
ar rcs libhello.a hello_fn.o
使用libhello.a生成可执行文件的方法有两种
(1)gcc -Wall main.c libhello.a -o main
(2)gcc -Wall -L. main.c -o main -lhello
(-L.表示库文件的位置在当前目录下,否则在系统的目录下搜索)
库的搜素路径

1 -I 指定头文件路径2.-L  指定库的目录  未指定的话先在当前文件夹搜素,后在系统环境变量下搜索3.修改环境变量vi ~/.bash_profile 4.1 export LIBRARY_PATH=/库文件所在路径环境变量 即增加C_INCLUDE_PATH  LIBRARY_PATH4.2 运行时LD_LIBRARY_PATH=/共享库:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=./

共享库生成

 gcc prin.h -fpic -shared -o libPerson.so    //fpic表示prin里边的函数与代码位置不相关,通过头文件名字就可以找到  -shared 动态库  lib+库名+.so gcc main.cpp -o main -lPerson gcc manycfile.c -o main -lPerson gcc main.cpp -o main -I ../Person -L../Person -lPerson    -I  指定自定义的头文件的路径    -L  指定动态链接库的目录,否则到系统默认环境变量的目录去找    -l   后边加动态链接库的名字libPerson.so就是-lPerson执行的时候要指定.so的路径可以export LD_LIBRARY_PATH=./Person(.so所在目录)或者复制.so到环境变量位置"#include <stdlib.h> ” 用于标准库文件或系统提供的头文件,到保存系统标准头文件的位置查找头文件。而"#include "userdefined.h"用于用户自定义的头文件,先从当前目录查找是否有指定名称的头文件,若当前目录未找到该头文件,再从标准文件目录中查找。这两种方式有他们的本质区别。在c语言程序设计中包含的头文件可分为系统标准头文件和用户工程中自定义的头文件,对于系统标准库头文件可以用这两种方式进行包含,但是采用第一种方式更节省时间,所以一般建议采用第一种方式。对于用户自己定义的头文件(保存在工程路径下)只能用第二种方式进行包含操作,否则出错(当然也可以把自己定义的工程中需要的头文件放在标准头文件路径下,但是这违背常规操作)。 加载运行共享库的方法   1 拷贝.so到系统共享库的路径下cp lib.so /usr/lib  ./main 2 更改LD_LIBRARY_PATH .bash_profile 3 ldconfig 配置ld.so.conf,ldconfig更新id.so.cache vi /etc/ld.so.conft添加库ldconfig

头文件和库文件:编译时,编译器通过头文件找到对应的函数库
库函数是指事先由程序员编制好的函数。
多数情况下,基于各种理由,这些库函数仅提供二进制形式的目标代码给调用者链接,却没有提供源码形式的函数定义。

库函数的调用

  • (1)在程序中添加库函数声明
    多数库函数将自己的函数原型和特殊数据等放在头文件(.h)中,
    所以应首先使用文件包含命令将这些头文件包含到程序中。例如欲
    使用数学库函数,文件包含命令为:
    #include <cmath>
    从而使得程序有函数声明,例如:y=sin(x);调用就能够通过编译
    (2)将库函数目标代码链接到程序中。
    在链接时,使用了库函数,就必须要有库函数的实现代码才能生成可执行文件,否则链接出错。要将库函数的目标代码能够链接到程序中,主要是配置好开发环境的相关参数,然后由连接器处理。
    标准库函数的连接在开发环境中是默认的,一般可以不用特别设置。
原创粉丝点击