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上 的创建、使用
一.什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以 ...
随机推荐
- centos7服务器搭建javaweb运行环境及代码部署
之前在一直在学习java web终于写完了第一个小demo,于是在阿里云上买了一个服务器,开始了配置服务器环境的踩坑之旅.... ps:本文不讨论服务器配置的具体步骤,网上都很多,按部就班就是,本文主 ...
- canvas的isPoinInPath API实现交互
- 关于Android Studio中的一个小问题——R文件引用Id失败
错误情况: 今天使用AS建立了一个新的EmptyProject,结果出现错误 setContentView(R.layout.activity_main); R文件的引用Id失败.真的是莫名奇妙... ...
- Struts2_用Action的属性接收参数
先在 Action 中定义要接收的属性,需要编写属性的getter 和 setter 方法 struts2 会自动帮我们把 String 类型的参数转为 Action 中相对应的数据类型. priva ...
- 算法练习-字符串转换成整数(实现atoi函数)
练习问题来源 https://leetcode.com/problems/string-to-integer-atoi/ https://wizardforcel.gitbooks.io/the-ar ...
- 时域反射计(TDR)原理与应用
[施工编辑中...] 1. 什么是TDR? TDR = Time Domain Reflectometry 时域反射计TDR用来测量信号在通过某类传输环境传导时引起的反射,如电路板轨迹.电缆.连接器等 ...
- 将 Azure SQL 内数据下载到本地,满足企业的「数据收集」
嫌长不看版 本文介绍了通过复制和导出两个操作,将 Azure SQL 数据库中的内容转移至其他位置(例如本地环境)的具体做法.借此可以帮助用户在 Azure 中运行数据库的同时,在本地或指定的其他位置 ...
- iptable防范ddos攻击
Basic DoS Protection https://github.com/MPOS/php-mpos/wiki/Basic-DoS-Protection # Rule 1: Limit New ...
- Active Directory架构管理
Active Directory由对象(用户,计算机,打印机,组等)及其属性(属性)组成.Schema 是Active Directory的重要组件,因为它定义了用于存储数据的所有对象和属性.Acti ...
- 项目01-nginx模块
项目01-nginx模块 1.nginx介绍 nginx是一款高性能web服务器和反向代理服务器,在互联网项目中使用非常频繁,尤其其出色的性能以及轻量级进程占用,已经超过了apache的httpd服务 ...