linux生成动态链接库返回字符串,Linux动态链接库的生成和使用

目录

1. 编写C程序

比如编写myfunc.c文件,里面包含两个函数,一个是say_hello,另一个是cal_sum。

#include "myfunc.h"

void say_hello()

{

printf("hello world\n");

}

int cal_sum(int x, int y)

{

return x + y;

}

为myfunc.c编写接口文件

#ifndef __MY_FUNC_H

#define __MY_FUNC_H

#include

#include

void say_hello();

int cal_sum(int x, int y);

#endif

2. 编译动态链接库

首先编译myfunc.c:

gcc -c -fPIC -o myfunc.o myfunc.c

-c 表示只编译(compile),而不链接,输出目标文(obj文件)。

-o 表示输出文件的文件名。

-fPIC PIC指Position Independent Code, 生成适合在共享库中使用的与位置无关的代码。编译成共享库要求此选项。适用于动态链接并避免对全局偏移表大小的任何限制。

生成共享库文件libmyfunc.so

gcc -shared myfunc.o -o libmyfunc.so

-share 生成一个共享对象,然后可以与其他对象链接以形成可执行文件。

两条命令合成一条就是:

gcc -fPIC -shared myfunc.c -o libmyfunc.so

3. 使用共享库

接下来我们使用test.c来调用共享库。test.c内容如下:

#include "myfunc.h"

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

{

int result = 0;

say_hello();

result = cal_sum(2, 3);

printf("%d\n", result);

return 0;

}

编译上述包含.h头文件的程序,GCC编译器需要知道头文件的位置

对于#include <...>,GCC编译器会在默认include搜索路径中寻找。

对于#include "...",GCC编译器会在当前路径搜索.h文件。你也可以使用-I选项提供额外的搜索路径,比如-I /home/test/。

除此之外,GCC编译器还需要知道我们用了哪个库文件,库文件在哪里

使用-l选项说明库文件的名字。这里,我们使用的是libmyfunc.so库文件,所以选项是这样写的:-l myfunc

使用-L选项说明库文件的路径。这里,我们的库文件是在当前路径,所以选项是这样写的:-L .(.表示当前路径)。

所以,最终我们链接库文件生成的可执行文件命令是这样的:

gcc -o test test.c -l myfunc -L .

附加:

可以使用下面的命令,来获知系统的include默认搜索路径:

$ gcc -print-prog-name=cc1 -v

获知库默认搜索路径:

$ gcc -print-search-dirs

4. 执行程序

$ ./test

执行程序后发现出现这样的情况:

./test: error while loading shared libraries: libmyfunc.so: cannot open shared object file: No such file or directory

这是因为执行程序的时候,操作系统不知道libmyfunc.so的位置,系统无法找到libmyfunc.so库文件。尽管我们用GCC编译的时候,用-L选项提供了libmyfunc.so文件的位置,但是这个信息并没有被写入到可执行程序里面。下面用命令ldd命令测试(ldd命令是用于显示可执行文件所依赖的库):

$ ldd test

linux-vdso.so.1 => (0x00007ffccc9fe000)

libmyfunc.so => not found

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0d31a44000)

/lib64/ld-linux-x86-64.so.2 (0x00007f0d31e0e000)

可以看出可执行文件test无法找到libmyfunc.so库文件。

解决办法有几个:

将libmyfunc.so放到gcc默认搜索目录,比如/usr/lib/x86_64-linux-gnu或者/lib/x86_64-linux-gnu都可以,这样做简单粗暴。但要是这样做的话,需要root权限来完成,除此之外,我感觉污染了整个系统。

在/etc/ld.so.conf.d目录下新建一个.conf文件,比如mylib.conf,在里面添加第三方库(libmyfunc.so)目录路径

设置LD_LIBRARY_PATH环境变量,比如export LD_LIBRARY_PATH=.。设置这个环境变量之后,操作系统将在先在LD_LIBRARY_PATH下搜索库文件,再到默认路径中搜索文件。这样,可执行文件就可以在LD_LIBRARY_PATH中找到第三方库(libmyfunc.so)的位置。

编译的时候添加-Wl,-rpath选项,比如gcc -o test test.c -l myfunc -L . -Wl,-rpath=.。-Wl选项告诉编译器将后面的参数传递给链接器

最后运行可执行文件test的结果:

$ gcc -o test test.c -l myfunc -L . -Wl,-rpath=.

$ ./test

hello world

5

5. 参考资料

【ARM-Linux开发】linux下Eclipse进行C编程时动态链接库的生成和使用

linux下Eclipse进行C编程时动态链接库的生成和使用 引用 http://linux.chinaitlab.com/soft/864157.html 欢迎进入Linux社区论坛,与200万技术 ...

Linux动态链接库的创建与使用

Linux动态链接库的创建与使用1. 介绍     使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数 ...

Linux静态库生成指南

Linux静态库生成指南   Linux上的静态库,其实是目标文件的归档文件.在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生 ...

Linux Makefile自动生成--config&period;h

Linux Makefile自动生成--config.h http://blog.csdn.net/spch2008/article/details/12510805

在 Linux 中自动生成 Cordova&sol;Phonegap for Android 的 APK 安装程序

在 Linux 中自动生成 Cordova/Phonegap for Android 的 APK 安装程序 本贴首发于: http://xuekaiyuan.com/forum.php?mod=vie ...

Linux下随机生成密码的命令总结

有时候经常为如何设置一个安全.符合密码复杂度的密码而绞尽脑汁,说实话,这实在是一个体力活而且浪费时间,更重要的是设置密码的时候经常纠结.终于有一天实在忍不住了,于是学习.整理了一下如何使用Linux下 ...

使用linux perf工具生成java程序火焰图

pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...

VS2010动态链接库的生成及调用(C&plus;&plus;)

一.动态链接库的生成 首先利用VS2010新建一个空的工程或者win32工程 2.在工程中添加头文件和源文件 3.工程属性配置 3.1 可以在解决方案目录下新建以下几个文件夹 bin (用于存放Rel ...

Linux动态库生成与使用指南

相关阅读: Linux静态库生成指南 Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件. 在链接动态库生成可执行文件时,并不 ...

随机推荐

win10 安装framework3&period;5

win+x 点击命令提示符(个管理员) 输入dism.exe /online /enable-feature /featurename:NetFX3 /Source:H:\sources\sxs(解压 ...

解决IE6&sol;IE7&sol;IE8不支持before&comma;after问题

对从事web开发的朋友来讲,低版本的IE永远是一个痛点,不支持最新技术(如css3,html5). 在现在web开发中使用图标字体已经很广泛,如Font Awesome,Bootstrap等,字体图片 ...

API断点大全

1.限制程序功能函数 EnableMenuItem 允许.禁止或变灰指定的菜单条目EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰) 2.对话框函数 CreateDia ...

2015最新iherb海淘攻略-图文入门教程

IHerb是美国最热门的海淘海购网站之中的一个,适合不爱担心,怕麻烦的朋友入门海淘,由于它有中文页面,可直邮中国,上千个母婴用品.化妆品.保健品品牌,最重要的是!首次下单,价值$40及以上的订单会马上 ...

基于python的《Hadoop权威指南》一书中气象数据下载和map reduce化数据处理及其可视化

文档内容: 1:下载中的气象数据 2:对下载的气象数据归档整理并读取数据 3:对气象数据进行map reduce进行处理 关键词:

counter 计数器

包含了两个属性和一个方法: 1. counter-reset 2. counter-increment 3. counter()/counters()   counter-reset(主要作用就是给计 ...

Spring Boot与缓存

---恢复内容开始--- JSR-107.Spring缓存抽象.整合Redis 一.JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheMana ...

每日一练之排序算法&lpar;P1097 统计数字&rpar;

某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5×10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. ...

01简单工厂模式SimpleFactory

一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态 工厂方法模式.通过专门定义一个类来负责创建 其他类的实例,被创建的实例通常都具有共同的 父类. 二.模式中包含的角色及其职责 1.工 ...

&lbrack;转&rsqb;IDEA 出现编译错误 Multi-catches are not supported a this language level 解决方法

转自 http://blog.csdn.net/qq465235530/article/details/53897538 首先出现这种问题是说明正在使用低版本jdk编译其本身不支持的语法,出现这种情况 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值