第二课 GCC入门之静态库以及共享库
序言:
前面一课讲了gcc的简单入门,包括gcc编译步骤:预处理;编译;汇编;链接。今天这节课就来讲下linux的库也欢迎大家吐糟共同学习。
原理:
linux系统中分为2种库:静态库和共享库。静态库是以.a后缀结尾的文件,通常是在编译的链接阶段指定静态库的位置进行编译生成可执行文件,因此生成的可执行文件在执行的时候不需要静态库的参与。动态库共享库是以.so后缀结尾的文件,通常情况下代码中有需要用到共享库的地方在编译链接阶段指定共享库的路径在执行可执行文件的时候从内存表中读取代码,内存中只有一份所有程序共享,所以这个方式是要求共享库必须参与如果运行时找不到是会报错的。这2种库系统都有默认的路径一般都是/usr/lib/和/lib以及/usr/local/lib,这也要看具体的系统版本,也分32位和64位的路径。下面就来具体实践一下。
实践:
建立相关文件步骤如下:
1>建立calc.h文件,并输入如下代码:
#ifndef CALC_H
#define CALC_H double Add(double a,double b); #endif
2>建立calc.c文件,并输入如下代码:
#include <stdio.h>
#include "calc.h" double Add(double a,double b)
{
return a + b;
}
3>建立calcmain.c文件,并输入如下代码:
#include <stdio.h>
#include "calc.h" int main(void)
{
double c = Add(2.0,3.0);
printf("result:%f",c);
return 0;
}
4-1>生成静态库执行,命令如下:
gcc -Wall calc.c -o calc.o
gcc -Wall calcmain.c -o calcmain.o ar rcs libcalc.a calc.o //使用ar命令生成静态库 gcc -Wall calcmain.o libcalc.a -o calc //生成calc可执行文件,
4-2>生成动态共享库执行。命令如下:
//因为之前已经生成了calc.o以及calcmain.o 2个目标文件
gcc -shared -fPIC calc.o -o libcalc.so //使用gcc生成共享库,其中-shared:共享库;-fPIC:与位置无关 gcc -Wall calcmain.o -o calc -L. -lcalc //-L.:当前目录搜索;-l:使用外部lib库。 export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH //指定临时共享库搜索路径,上面的-L.参数经过实验无效不知道为什么,共享库搜索的路径默认是不会搜索当前路径的。
以上是这次实践的相关步骤,其中在gcc编译过程中是可以直接以源码C文件生成目标文件的再次忽略掉了!这一课中静态库知识点相关比较少,现在的开发也比较少用。关于共享库大家可以看看这边博客文章多了解了解。
第二课 GCC入门之静态库以及共享库的更多相关文章
- Linux下库的制作(静态库与共享库)
库中实际上就是已编译好的函数代码,可以被程序直接调用. Linux下的库一般的位置在/lib或者/usr/lib中 静态库 静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在 ...
- linux下的静态库和共享库
转载&&增加: 我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...
- Linux 静态库与共享库的使用
申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链接库详细情况可见这篇文章:windows动态链接库 DLL 浅析.虽然原理,思想差不多,但是细节却各有不同. 一.静 ...
- 【转】Linux 静态库与共享库的使用
原文网址:http://blog.csdn.net/heyabo/article/details/11688517 申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链 ...
- gcc创建静态库和共享库
静态库和动态(共享)库静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小,其 ...
- Linux命令(十二)制作静态库和共享库
1. 静态库 静态库文件命名:libxxxx.a 1.1 步骤: ar rcs libCalc.a *.o 1.2 用nm查看文件内容 1.3 发布并使用 gcc main.c -o mycpp.ou ...
- Linux静态库和共享库
1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...
- Linux静态库和共享库【转】
转自:http://www.cnblogs.com/zlcxbb/p/6806269.html 1.什么是静态库 静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Wi ...
- Qt 静态库与共享库(动态库)共享配置的一个小办法
对于用 QtCreator 编写静态库,动态库,如何能够以最小的改动, 方便的实现两种形式的库文件生成:可以这麽做: 1)使用想到建立静态库 2)在项目配置文件*.pro 中: TARGET = n ...
随机推荐
- Shoot the Bullet ZOJ - 3229 有源汇有上下界的最大流
/** zoj提交评判不了,所以不知道代码正不正确.思路是应该没问题的.如果有不对的地方,请多指教. 题目:Shoot the Bullet ZOJ - 3229 链接:https://vjudge. ...
- 文本识别OCR浅析:特征篇
OCR技术浅探:特征提取(1) 研究背景 关于光学字符识别(Optical Character Recognition, 下面都简称OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究 ...
- 【Mac + Appium + Python3.6学习(四)】之常用的IOS自动化测试API总结
环境: Appium:1.9.1 Appium-desktop:1.7.1 Xcode:10.0 IOS:iPhone5S(10.3.3) Mac:10.13.6 ①获取手机屏幕size:长.宽 &l ...
- 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderList
最近在用idea部署war文件的时候,总是出现了部署失败的错误,刚开始并没有在意,但是现在次数越来越多了,不得不在意了,然后就在百度上搜,然后就有了各种说法 1,错误的信息是: One or more ...
- 嵌入式驱动开发之dsp fpga通信接口---spi串行外围接口、emif sram接口
-----------------------------------------author:pkf ------------------------------------------------ ...
- jquery如何判断表格同一列不同行input数据是否重复
function hasRepeat(objId,columnIndex){ var arr = []; $("#"+objId+" tbody tr").ea ...
- poj 3281(网络流+拆点)
题目链接:http://poj.org/problem?id=3281 思路:设一个超级源点和一个超级汇点,源点与食物相连,饮料与汇点相连,然后就是对牛进行拆点,一边喜欢的食物相连,一边与喜欢的饮料相 ...
- wpf的MVVM框架
http://www.cnblogs.com/KnightsWarrior/archive/2010/11/01/1866641.html 框架名字的介绍在 文章的后面
- Django - admin后台、auth权限
admin后台 一.创建一个管理员用户 (1).设置时区.语言(可选步骤) 打开settings.py,改成下面那样 LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'As ...
- selenium调用Firefox和Chrome需要注意的一些问题,和出现的报错selenium:expected [object undefined] undefined to be a string
在高版本selenium下如:selenium3.4.3 1.高版本的selenium需要浏览器安装一些补丁驱动 Firefox:geckodriver 下载网址:http://download.cs ...