使用库函数是源码的一种保护???  <我猜的.>

库函数其实不是新鲜的东西,我们一直都在用,比如C库.

我们执行pringf() 这个函数的时候,就是调用C库的函数.

下面记录静态库和动态库的生成和使用.

静态库:libxxx.a

动态库:libxxx.so

静态库: 在程序编译的时候,将库编译进可执行程序中, 运行的时候不需要外部函数库

动态库: 在程序运行的时候,将库加载到程序中,运行的时候需要外部函数库

函数库的目录有 /lib 和 /usr/lib 和 自定义

一. 静态库的生成和使用

下面通过一个简单的小栗子来介绍库函数怎么生成和使用.

1.库函数的源码 hello.c

#include "stdio.h"

int hello(void){

    printf("hello lib");
  return 0;
}

2. 库函数的头文件 hello.h

#ifndef __HELLO_H
#define __HELLO_H int hello(void); #endif

库文件的头文件是库文件的目录,因为库文件是保护的,看不到里面的源码,所以把函数接口通过头文件来让人调用 .

这样就实现了接口,也保护了源码

3.编译静态库函数

3.1 将 hello.c 编译成目标文件 生成  hello.o文件

gcc -c hello.c

3.2 将.o文件打包成静态库 生成 libhello.a库文件

ar -cr libhello.a hello.o

 

4 使用静态库,因为静态库是在编译的时候一起打包进程序的,所以如果编译的时候没有静态库文件,则无法编译

4.1 main.c 写一个main函数来调用库函数

#include "hello.h"    //引入库函数的头文件,这样才能找到函数声明

int main{

  hello();        //调用库函数

}

正常编译的时候是没办法通过的. 因为编译器找不到 hello() 的实现代码. 如图:

所以在编译的时候要加入库引用

gcc -c main -L. -lhello -o a.out  

-L<路径> 引用自定义库的路径,如果调用系统库就不用-L  '.'表示当前文件夹

-lxxxx 这里libhello.a 只要写hello 就可以   //小写的L

4.2 直接可以执行,因为库函数已经被编译进去了

二.动态库的编译及使用

同样的hello.c 源码

1.生成.o文件

gcc -c -fpic hello.c //如果这里没有加-fpic 下一步就会提示你重新用 -fpic编译

2. 编译成动态库

gcc -shared -fpic -o libhello.so hello.o

-shared 是生成动态库

-fpic 生成位置无关代码,默认加

3. 使用动态库 和静态库一样

gcc main.c -L. -lhello -o a.out

4. 执行 用动态库编译的程序没办法直接执行

在读取共享库libhello.so的时候出错,没有找到该文件

因为动态库程序会默认在 /lib  或者 /usr/lib的路径下寻找, 所以

解决的办法有3个:

1. 将.so 文件拷贝到 /usr/lib/文件夹下面

2.添加PATH环境变量

export LD_LIBRARY_PATH=<动态库所在的绝对路径>

3.修改配置脚本

将动态库所在的路径加到  /etc/ld.so.conf 文件里

vim /etc/ld.so.conf

添加后刷新

/sbin/ldconfig

C语言函数篇(五)静态库和动态库的创建和使用的更多相关文章

  1. C语言中静态库和动态库笔记

    库 库,故名思议,是存放东西的地方,其中存放的东西可以被多个人公用. 程序中借用库的概念,描述将代码进行抽取,这种代码被大多数程序使用, 其过程具有一定的模块化.封装.抽象的特征. 按照库的使用方式, ...

  2. UNIX环境下用C语言写静态库与动态库

    静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS ...

  3. C语言函数篇(二)函数参数基础设计

    形参实现一种数据传入的接口 ,由 实参 拷贝给 形参. 拷贝!!!!!!!!!!! 例1: void func(int tmp){ //意图是实现传进来的参数 +1 tmp++; } int mian ...

  4. C语言静态库与动态库(Windows下测试)

    转载于:https://zhidao.baidu.com/question/1946953913764139388.html,原文为Linux上测试,本文为在Windows上编译测试 我们通常把一些公 ...

  5. linux中C的静态库和动态库分析

    从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...

  6. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  7. iOS 静态库,动态库与 Framework 浅析

    静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...

  8. 详解UE4静态库与动态库的导入与使用

    转自:http://blog.csdn.net/u012999985/article/details/71554628 一.基本内容概述   最近做项目时经常看到build.cs文件,就想研究一下UE ...

  9. C++ 静态库与动态库以及在 Windows上 的创建、使用

    一.什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以 ...

随机推荐

  1. Hibernate课程 初探一对多映射4-3 测试--信息查询

    建立双向一对多关系,既可以由一方查询多方信息,同样可以由多方查询一方信息 demo: //查询学生所在班级 public static void showGidByStudent(){ Session ...

  2. lnmp架构-负载均衡

    一.几个基本概念 1.pv 值 pv 值(page views):页面的浏览量 概念:一个网站的所有页面,在一天内,被浏览的总次数.(大型网站通常是上千万的级别) 2.uv值 uv值(unique v ...

  3. angular2-组件样式

    组件样式: :host 选择器 使用:host伪类选择器,用来选择组件宿主元素中的元素(相对于组件模板内部的元素) 这是我们能以宿主元素为目标的唯一方式.除此之外,我们将没办法指定它, 因为宿主不是组 ...

  4. SublimeText插件 : sass语法高亮

    安装 :sublime中安装sass插件和sass build插件  就可以高亮显示sass 步骤:安装 sass插件和sass build (安装过程不细说) 步骤2:打开.sass文件,进行以下设 ...

  5. 拖拽事件--select外边框拖拽

    地图上面的搜索框要可拖拽 但是搜索框是有点击事件的,点击显隐下拉菜单,如果拖拽的事件源选择select框的话,会有样式(十字拖动符cursor:move与selelt默认点击的箭头)冲突 思索良久,就 ...

  6. spring-cloud构架微服务(2)-全局配置二

    接上篇,实际项目中,可能会遇到有些配置项,例如:邮件地址.手机号等在服务已经上线之后做了改动(就当会出现这种情况好了).然后你修改了配置信息,就得一个一个去重启对应的服务.spring-全局配置提供了 ...

  7. Javascript基础--数据类型

    一.基本数据类型 1.字符类型:表示字符的类型,例:'aaa',"aaaa",'123456',''(空字符) 2.数字类型:表示数字的类型,例:0,1,3.1415936等 特殊 ...

  8. mysql5.1安装图解教程

    mysql5.1安装图解教程 曾经为了要搭建模拟平台,从内地网站学习到台湾网站,其中必不可少的一项就是MySQL,那时候正好普遍用5.1,所以也很习惯用MySQL5.1版本! 下面就以MySQL5.1 ...

  9. yum第三方源

    EPEL RHEL 6: http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm RHEL 7: http:// ...

  10. 笨办法学Python(二十九)

    习题 29: 如果(if) 下面是你要写的作业,这段向你介绍了“if语句”.把这段输入进去,让它能正确执行.然后我们看看你是否有所收获. people = 20 cats = 30 dogs = 15 ...