转:如何用gcc编译生成动态链接库*.so文件 动态库

转:如何编译.so动态库
问:我源文件为main.c, x.c, y.c, z.c,头文件为x.h,y.h,z.h
如何编译成.so动态库?
编译器用gcc
最好能给出详细参数解释,谢谢

答:
# 声称动代连接库,假设名称为libtest.so
gcc x.c y.c z.c -fPIC -shared -o libtest.so

# 将main.c和动态连接库进行连接生成可执行文件
gcc main.c -L. -ltest -o main

# 输出LD_LIBRARY_PATH环境变量,一边动态库装载器能够找到需要的动态库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

# 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
ldd main

# 执行就不用说了吧

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-L.:表示要连接的库在当前目录中

-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用
/sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

举例:
动态链接库*.so的编译与使用- -
                                      

动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。
1、动态库的编译

下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。

so_test.h:



#include <stdio.h>

#include <stdlib.h>



void test_a();

void test_b();

void test_c();



test_a.c:



#include "so_test.h"



void test_a()

{

    printf("this is in test_a...\n");

}



test_b.c:



#include "so_test.h"



void test_b()

{

    printf("this is in test_b...\n");

}



test_a.c:



#include "so_test.h"



void test_c()

{

    printf("this is in test_c...\n");

}



将这几个文件编译成一个动态库:libtest.so



$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so


2、动态库的链接

在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。

test.c:



#include "so_test.h"



int main()

{

    test_a();

    test_b();

    test_c();

   

    return 0;

}



l         将test.c与动态库libtest.so链接生成执行文件test:



$ gcc test.c -L. -ltest -o test



l         测试是否动态连接,如果列出libtest.so,那么应该是连接正常了



$ ldd test



l         执行test,可以看到它是如何调用动态库中的函数的。
3、编译参数解析
最主要的是GCC命令行的一个选项:
          -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

l         -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

l         -L.:表示要连接的库在当前目录中

l         -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

l         LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

l         当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
4、注意

       调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业镜头的主要参数与选型

文章目录简介1、镜头的分类(1) 以镜头安装分类(2) 以摄像头镜头规格分类(3) 以镜头光圈分类(4) 以镜头的视场大小分类(5) 从镜头焦距上分2、选择镜头的技术依据(1) 镜头的成像尺寸(2) 镜头的分辨率(3) 镜头焦距与视野角度(4) 光圈或通光量3、变焦镜头&#xff08;zoom lens&…

SQLSEVER 中的那些键和约束

SQL Server中有五种约束类型&#xff0c;各自是 PRIMARY KEY约束、FOREIGN KEY约束、UNIQUE约束、DEFAULT约束、和CHECK约束。查看或者创建约束都要使用到 Microsoft SQL Server Managment Studio。1. PRIMARY KEY约束 在表中常有一列或多列的组合&#xff0c;其值能唯一标识表…

数据库 sqlite 进阶

http://www.cppblog.com/czy463/archive/2013/12/16/204816.html 董淳光 前序&#xff1a; Sqlite3 的确很好用。小巧、速度快。但是因为非微软的产品&#xff0c;帮助文档总觉得不够。这些天再次研究它&#xff0c;又有一些收获&#xff0c;这里把我对 sqlite3 的研究列出来&a…

形象的列举-C# 枚举

文章目录简介例子分析点拨博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 简介 枚举类型用于声明一组命名常数。 定义枚举类型语法格式如下&#xff1a;enum 枚举数组名{枚举成员列表};例如&#xff1a; enum week{星期一&#xff0c;星期二…

Confluence 6 手动备份站点

2019独角兽企业重金招聘Python工程师标准>>> Confluence 被配置自动备份数据&#xff0c;使用压缩的 XML 格式。同时你也可以通过 Confluence 的 管理员控制台&#xff08;Administration Console&#xff09;手动进行备份。 你需要具有 System Administrator 权限才…

编写高质量的Makefile

分类&#xff1a; c/c研究 GNU&amp;LINUX2010-09-12 15:31163人阅读 评论(0)收藏举报源地址 &#xff1a;http://acm.hrbeu.edu.cn/forums/index.php?showtopic1827&st0&gopid8924&#entry8924 一、前言 回想自己的第一个Makefile&#xff0c;是这个样子的 …

第六篇:python基础之文件处理

第六篇&#xff1a;python基础之文件处理 阅读目录 一.文件处理流程二.基本操作2.1 文件操作基本流程初探2.2 文件编码2.3 文件打开模式2.4 文件内置函数flush2.5 文件内光标移动2.6 open函数详解2.7 上下文管理2.8 文件的修改一.文件处理流程 打开文件&#xff0c;得到文件句柄…

前端每日实战:56# 视频演示如何用纯 CSS 描述程序员的生活

效果预览 按下右侧的“点击预览”按钮可以在当前页面预览&#xff0c;点击链接可以全屏预览。 https://codepen.io/comehope/pen/YvYVvY 可交互视频 此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。 请用 chrome, safari, edge 打开观看。 ht…

从特殊到一般-C#中的类

文章目录类的概念类的定义实例例子分析类的成员数据成员属性成员方法成员静态成员博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 类的概念 在日常生活中&#xff0c;类是对具有相同特性的一类是物的抽象。比如水果是一个类&#xff0c;它是对…

Chapter 1 First Sight——30

The girl sitting there giggled. Id noticed that his eyes were black — coal black. 那个坐在那里的女孩笑着。我注意到她的眼睛是很色的--炭黑色的。 Mr. Banner signed my slip and handed me a book with no nonsense about introductions. Banner 先生签了我的名字然后…

GPU 与CPU的作用协调,工作流程、GPU整合到CPU得好处

在不少人的心目中&#xff0c;显卡最大的用途可能就只有两点——玩游戏、看电影&#xff0c;除此之外&#xff0c;GPU并没有其他的作用了。但是随着微软IE9的正式发布&#xff0c;不少人突然发现&#xff0c;微软一直提到一个名词&#xff1a;GPU硬件加速&#xff0c;从而也让不…

[luoguP1029] 最大公约数和最小公倍数问题(数论)

传送门 一.暴力枚举&#xff08;加了点优化&#xff09; #include <cstdio>int x, y, ans;inline int gcd(int x, int y) {return !y ? x : gcd(y, x % y); }inline int lcm(int x, int y) {return x / gcd(x, y) * y; }int main() {int i, j;scanf("%d %d", …

CPU和GPU擅长和不擅长的方面

从它们执行运算的速度与效率的方面来探讨这个论题。CPU和GPU都是具有运算能力的芯片&#xff0c; CPU更像“通才”——指令运算(执行)为重数值运算&#xff0c; GPU更像“专才”——图形类数值计算为核心。在不同类型的运算方面的速度也就决定了它们的能力——“擅长和不擅长”…

一些IO流的知识

IO流&#xff1a; 输入流&#xff1a;输出流&#xff1a; 字节流&#xff1a;字符流&#xff1a;为了处理文字数据方便而出现的对象。 其实这些对象的内部使用的还是字节流(因为文字最终也是字节数据) 只不过&#xff0c;通过字节流读取了相对应的字节数&#xff0c;没有对这些…

为人示弱,做事留余 | 摸鱼系列

我很喜欢结交有很好的自然观察能力的朋友&#xff0c;这是种对周围环境和文化的洞察力。 一方面的原因是优秀的领导者、企业家和投资人能利用这种能力发现新市场&#xff0c;预测新潮流&#xff0c;设计出有效的市场营销活动&#xff0c;并找到需要重点关注的人群。 另一方面&a…

从一般到特殊-C#中的对象

文章目录对象的概念对象的创建和使用匿名类型和初始化器构造函数和析构函数构造函数析构函数范例参数传递博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 对象的概念 类是具有相同特征一类事物的抽象&#xff0c;而对象是类的实例。 类和对象…

如何用面对对象来做一个躁动的小球?

今天来看看怎样用面对对象来做一个躁动的小球。 首先我们先创建一个对象&#xff0c;他的属性包含小球的随机水平、纵向坐标&#xff0c;随机宽、高&#xff0c;随机颜色&#xff0c;以及创建小球的方法。 html: <div id"wrap"></div> js:function Boll(…

关于MyEclipse项目的名字的修改对项目导入导出的影响

不要修改项目名字&#xff0c;不管是在MyEclipse中(.project文件里面的额name会变)还是在G:\MyEclipseData目录下(.project文件里面的额name不会变)&#xff0c;否则导入的时候不能访问&#xff0c;会出现400的错误&#xff0c;而访问的网址必须是以前没改名前的那个名字才可以…

Gcc详解以及静态库、动态库生成

[转] Gcc详解以及静态库、动态库生成 http://www.360doc.com/content/10/0619/14/1795182_33985297.shtml 1。gcc包含的c/c编译器 gcc,cc,c,g,gcc和cc是一样的&#xff0c;c和g是一样的&#xff0c;(没有看太明白前面这半句是什 么意思:))一般c程序就用gcc编译&#xff0c;c程序…

改变世界的七大NLP技术,你了解多少?(上)

什么是NLP&#xff1f; 自然语言处理&#xff08;NLP&#xff09; 是计算机科学&#xff0c;人工智能和语言学的交叉领域。目标是让计算机处理或“理解”自然语言&#xff0c;以执行语言翻译和问题回答等任务。 随着语音接口和聊天机器人的兴起&#xff0c;NLP正在成为信息时代…