序言:

  前面一课讲了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入门之静态库以及共享库的更多相关文章

  1. Linux下库的制作(静态库与共享库)

    库中实际上就是已编译好的函数代码,可以被程序直接调用. Linux下的库一般的位置在/lib或者/usr/lib中 静态库 静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在 ...

  2. linux下的静态库和共享库

    转载&&增加:      我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...

  3. Linux 静态库与共享库的使用

    申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链接库详细情况可见这篇文章:windows动态链接库 DLL 浅析.虽然原理,思想差不多,但是细节却各有不同. 一.静 ...

  4. 【转】Linux 静态库与共享库的使用

    原文网址:http://blog.csdn.net/heyabo/article/details/11688517 申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链 ...

  5. gcc创建静态库和共享库

    静态库和动态(共享)库静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小,其 ...

  6. Linux命令(十二)制作静态库和共享库

    1. 静态库 静态库文件命名:libxxxx.a 1.1 步骤: ar rcs libCalc.a *.o 1.2 用nm查看文件内容 1.3 发布并使用 gcc main.c -o mycpp.ou ...

  7. Linux静态库和共享库

    1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...

  8. Linux静态库和共享库【转】

    转自:http://www.cnblogs.com/zlcxbb/p/6806269.html 1.什么是静态库 静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Wi ...

  9. Qt 静态库与共享库(动态库)共享配置的一个小办法

    对于用 QtCreator 编写静态库,动态库,如何能够以最小的改动, 方便的实现两种形式的库文件生成:可以这麽做: 1)使用想到建立静态库 2)在项目配置文件*.pro  中: TARGET = n ...

随机推荐

  1. 请说明SQLServer中delete from tablea & truncate table tablea的区别

    请说明SQLServer中delete from tablea & truncate table tablea的区别 解答:两者都可以用来删除表中所有的记录.区别在于:truncate是DDL ...

  2. mac os下android 通过battery-historian进行电量分析

    简单介绍下如何用battery-historian进行电量分析,因为battery-hostorian是基于go语言的框架,所以需要安装go 1.安装go 2.配置go环境变量到.bash_profi ...

  3. 【ask】Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.

    1.周五对nodejs tcp长连接服务器框架进行压测,一切开始比较常规(没什么特殊问题). 2.突然手一哆嗦,把压测用的客户端群一起关闭了. 3.这个时候nodejs的服务器爆出了"Cau ...

  4. linux软件的安装和卸载

    http://blog.chinaunix.net/uid-25572546-id-1995028.html

  5. Python_selenium之窗口切换

    Python_selenium之窗口切换 1. 运用switch_to.window()方法来进行窗口切换 2. 思路拆分: 浏览器获取百度贴吧网址 点击定位到一个元素,获取当前的句柄 获得所有的句柄 ...

  6. C# .net 多线程中集合数据同步

    from:http://www.cnblogs.com/GavinCome/archive/2008/04/09/1145250.html C# .net 多线程中集合数据同步(转) 集合类通常不是线 ...

  7. 存储过程根据ouID获取IntlPerson数据表

    /****************************************************************************** ** Name: usp_base_Ge ...

  8. cocos3.9 windows平台 AssetsManager创建文件失败问题

    在做热更新功能时用到了AssetsManager,发现在windows平台总是报CREATE_FILE错误,errorStr "Can't renamefile from: xxx.tmp ...

  9. JAVA基础面试(四4)

    31.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可能,”xyz”对应一个对象,这个对 ...

  10. mac下面安装mysql

    参考http://www.cnblogs.com/lakeslove/p/6280404.html 关于msyql5.7,安装时最大的改变就是有了一个默认密码 我安装的是mysql-5.7.17-ma ...