Linux下动态库文件的扩展名为".so"(Shared Object)。按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号)。静态库的文件名形式是libname.a。

本文仅以简单的例子介绍动态库文件的生成和链接方法。

一、库文件及测试文件代码

库文件及测试文件所在的目录:/root/so/

1.库文件名:myfirstso.c

#include <stdio.h>

void myfunction()

{

printf("this is a shared object\n");

}

2.测试文件名:test.c

#include <stdio.h>

int main(int argc,char *argv[])

{

myfunction();

return 0;

}

二、动态库的编译方法

编译库文件myfirstso.c:

[root@mgt so]# gcc -fPIC -shared -o libmyfirstso.so myfirstso.c

如果编译成功,会在 /root/so/下生成动态库文件:libmyfunction.so。

编译生成动态库的命令为:gcc (-fpic) -shared -o libmyfunction.so myfunction.c

-fpic 使输出的对象模块是按照可重定位地址方式生成的。

-shared指定把对应的源文件生成对应的动态链接库文件。

三、动态库的测试方法

编译测试文件test.c:

[root@mgt so]# gcc -o test test.c /root/so/libmyfirstso.so

成功编译后,生成test文件,运行test:

[root@mgt so]# ./test

this is a shared object

其中,gcc -o test test.c /root/so/libmyfirstso.so的最后一个参数指定所链接库文件的绝对路径。本例中库文件的绝对路径为:/root/so/libmyfirstso.so。 如果直接写相对路径会有错误。

  当然,如果想从系统的库文件路径(通常系统函数库的位于/usr/lib下)链接动态库的话,可以先将生成的库文件拷贝至/usr/lib/下,然后再链接:

[root@mgt so]# cp libmyfirstso.so /usr/lib

[root@mgt so]# gcc -o test test.c -lmyfirstso

[root@mgt so]# ./test

this is a shared object

这里,对于链接的方法作一下解释。对于gcc -o test test.c -lmyfunction中最后一个参数- lmyfirstso, 可见传给C编译器的命令行参数并未提到函数库的完整路径名,甚至没有提到在函数库目录中该文件的完整名字!实际上,编译器被告知根据选项- lmyfirstso链接到相应的函数库(/usr/lib下,注意如果是64的系统应该是/usr/lib64),函数库的名字是libmyfirstso.so, 也就是说,"lib"部分和文件的扩展名被省略了,但在前面加了一个l。

linux下c语言动态库生成方法相关推荐

  1. linux动态库路径生效,Linux下如何解决动态库的链接问题

    原标题:Linux下如何解决动态库的链接问题 静态库是一种以空间换取时间和移植性的做法,一些情况下确实有着一定的意义,但是一些情况下,我们自己编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有 ...

  2. 查看linux下程序或者动态库到底依赖哪些so动态库以及对应的版本

    一. ldd命令 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 # ldd /bin/ls linux-vdso.so.1 => (0x00 ...

  3. linux下怎么编译动态库并且调用

    样例描述:我有一个main.cpp文件件,add.cpp ,add.h ,subtract.cpp ,subtract.h文件,main.cpp里面调用加法和减法的函数,把加法和减法准备编译成动态库 ...

  4. Unix下设计动态库的方法《精通Unix下C语言编程与项目实践》(一)

    精通Unix下C语言编程与项目实践 之动态库的生成 作者:朱云翔,胡平 3.3 动态库的生成 动态库的生成可分为三个步骤,设计库源码.编译位置无关码(PIC)型.o文件和链接动态库.链接动态库的命令包 ...

  5. g++ 编译mysql动态库_Linux下g++编译以及使用静态库和动态库的方法详解

    下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在windows环境下,我们通常在IDE如VS的 ...

  6. Windows下查看exe可执行程序或dll动态库所依赖dll动态库的方法

    Windows下查看exe可执行程序或dll动态库所依赖dll动态库的方法 如需转载请标明出处:http://blog.csdn.net/itas109 技术交流:129518033 文章目录 Win ...

  7. linux+下c语言编程项目,精通UNIX下C语言编程与项目实践

    cc -I  //include 目录 -L //静态库目录?动态也可以 -l //小写L,接静态库名称?动态也可以 -DXXX='"XXFF"' //-D直接定义宏 -c 只编译 ...

  8. 您知道Linux下C语言编程的一些注意事项吗_教育中国

    您知道Linux下C语言编程的一些注意事项吗_教育中国 云风的 BLOG: 一个 C 接口设计的问题 一个 C 接口设计的问题 C 语言在本质上,参数传递都是值传递.不像 Pascal 和 C++ 可 ...

  9. Linux下C语言编程

    第1章 Linux下C语言编程简介 本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Li ...

  10. 初识Linux下C语言编程

    本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Linux下使用C语言编程有一个基本的了 ...

最新文章

  1. linux回到初始的命令,Linux基础总结简单常用命令
  2. 机器性能这么好,为什么点击右键弹出菜单还这么慢?
  3. A beginner’s guide to Cache synchronization strategies--转载
  4. agilebpm脑图_干货基于SpringBoot2开发的Activiti引擎流程管理项目脚手架
  5. arm-linux-gcc静态编译和动态编译的区别
  6. 语雀携手Teambition,玩转项目协作与知识管理
  7. 如何在K8S上玩转TensorFlow ?
  8. Dockerfile构建LNMP分离环境部署wordpress
  9. appscan无法连接到服务器_GTA5无法连接R星服务器怎么解决?无法连接解决方法
  10. 盘式过滤器工作原理介绍
  11. 假如时光倒流, 我会这么学习Java
  12. 2022年深圳杯建模A题思路: 破除“尖叫效应”与“回声室效应”,走出“信息茧房”
  13. 如何将数据添加到python_如何将数据导入python
  14. Tensorflow小白实战系列
  15. 【Qt】按键事件:Alt+F4
  16. CSS z-index属性层重叠顺序
  17. ElasticSearch教程
  18. Python Tkinter模块详解(后续持续补充)
  19. execl 截取函数 =LEFT(F2,9) 不管用,回车还是 =LEFT(F2,9)
  20. 描述卷积神经网络的结构,卷积神经网络三大特点

热门文章

  1. 分治法的基本思想_归并排序-分治思想的典型应用
  2. windows下双击可运行的Java软件打包方案
  3. 向窗口输入文字--TextOut和DrawText函数
  4. LINUX中nagios客户端安装步骤及遇到问题
  5. mysql修改有外键约束的表结构
  6. 动态修改ViewPagerIndicator CustomTabPageIndicator Tab标签文字颜色
  7. mysql可重复度能解决幻读吗
  8. Myeclipse破解后报错解决
  9. 关于java多线程堆和栈的共享问题
  10. ssl证书链的验证的其它方式