C语言函数篇(五)静态库和动态库的创建和使用
使用库函数是源码的一种保护??? <我猜的.>
库函数其实不是新鲜的东西,我们一直都在用,比如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语言函数篇(五)静态库和动态库的创建和使用的更多相关文章
- C语言中静态库和动态库笔记
库 库,故名思议,是存放东西的地方,其中存放的东西可以被多个人公用. 程序中借用库的概念,描述将代码进行抽取,这种代码被大多数程序使用, 其过程具有一定的模块化.封装.抽象的特征. 按照库的使用方式, ...
- UNIX环境下用C语言写静态库与动态库
静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS ...
- C语言函数篇(二)函数参数基础设计
形参实现一种数据传入的接口 ,由 实参 拷贝给 形参. 拷贝!!!!!!!!!!! 例1: void func(int tmp){ //意图是实现传进来的参数 +1 tmp++; } int mian ...
- C语言静态库与动态库(Windows下测试)
转载于:https://zhidao.baidu.com/question/1946953913764139388.html,原文为Linux上测试,本文为在Windows上编译测试 我们通常把一些公 ...
- linux中C的静态库和动态库分析
从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
- iOS 静态库,动态库与 Framework 浅析
静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...
- 详解UE4静态库与动态库的导入与使用
转自:http://blog.csdn.net/u012999985/article/details/71554628 一.基本内容概述 最近做项目时经常看到build.cs文件,就想研究一下UE ...
- C++ 静态库与动态库以及在 Windows上 的创建、使用
一.什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以 ...
随机推荐
- Hibernate课程 初探一对多映射4-3 测试--信息查询
建立双向一对多关系,既可以由一方查询多方信息,同样可以由多方查询一方信息 demo: //查询学生所在班级 public static void showGidByStudent(){ Session ...
- lnmp架构-负载均衡
一.几个基本概念 1.pv 值 pv 值(page views):页面的浏览量 概念:一个网站的所有页面,在一天内,被浏览的总次数.(大型网站通常是上千万的级别) 2.uv值 uv值(unique v ...
- angular2-组件样式
组件样式: :host 选择器 使用:host伪类选择器,用来选择组件宿主元素中的元素(相对于组件模板内部的元素) 这是我们能以宿主元素为目标的唯一方式.除此之外,我们将没办法指定它, 因为宿主不是组 ...
- SublimeText插件 : sass语法高亮
安装 :sublime中安装sass插件和sass build插件 就可以高亮显示sass 步骤:安装 sass插件和sass build (安装过程不细说) 步骤2:打开.sass文件,进行以下设 ...
- 拖拽事件--select外边框拖拽
地图上面的搜索框要可拖拽 但是搜索框是有点击事件的,点击显隐下拉菜单,如果拖拽的事件源选择select框的话,会有样式(十字拖动符cursor:move与selelt默认点击的箭头)冲突 思索良久,就 ...
- spring-cloud构架微服务(2)-全局配置二
接上篇,实际项目中,可能会遇到有些配置项,例如:邮件地址.手机号等在服务已经上线之后做了改动(就当会出现这种情况好了).然后你修改了配置信息,就得一个一个去重启对应的服务.spring-全局配置提供了 ...
- Javascript基础--数据类型
一.基本数据类型 1.字符类型:表示字符的类型,例:'aaa',"aaaa",'123456',''(空字符) 2.数字类型:表示数字的类型,例:0,1,3.1415936等 特殊 ...
- mysql5.1安装图解教程
mysql5.1安装图解教程 曾经为了要搭建模拟平台,从内地网站学习到台湾网站,其中必不可少的一项就是MySQL,那时候正好普遍用5.1,所以也很习惯用MySQL5.1版本! 下面就以MySQL5.1 ...
- yum第三方源
EPEL RHEL 6: http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm RHEL 7: http:// ...
- 笨办法学Python(二十九)
习题 29: 如果(if) 下面是你要写的作业,这段向你介绍了“if语句”.把这段输入进去,让它能正确执行.然后我们看看你是否有所收获. people = 20 cats = 30 dogs = 15 ...