首先我们通过三个文件生成一个对应的so库,1、

作者: 操作系统  发布:2019-11-20

老样子,相当少BiBi,直接踏向正题!

第黄金时代我们由此四个文本生成叁个一呼百诺的so库,然后演示怎样调用对应的库。生成对应的三个文件,test_a.c,test_b,c,test_c.c,so_test.h,test.c。
<code>
so_test.h
#include "stdio.h"
void test_a();
void test_b();
void test_c();
</code>
<code>
test_a.c
#include "so_test.h"
void test_a()
{
printf("this is in test_a..n");
}
</code>
<code>
test_b.c
#include "so_test.h"
void test_b()
{
printf("this is in test_b..n");
}
</code>
<code>
test_c.c
#include "so_test.h"
void test_c()
{
printf("this is in test_c..n");
}
</code>
<code>
test.c
#include "so_test.h"

一、安装Qt

后生可畏、linux下的静态库

 

int main()
{
test_a();
test_b();
test_c();
return 0;
}
</code>

那边自个儿利用的是Qt5.8,未有采用新型版本是怕其依附的别的库版本太低而设置退步。

  静态库中的被调用的函数的代码会在编写翻译时一同被复制到可试行文件中去的!!可奉行文件在运作无需静态库的存在!

有时在linux下编写翻译好QT程序,用QTCreator运维没难题,打包移植到另豆蔻年华台机器上,用命令./XX试行就能够报错:error while loading shared libraries:等等难题,有同学也许会问笔者的信任库已经放在可实施文件同目录下了,怎么会找不到啊,这里须求把您的可实践文件的目录配置到ld.so.conf文件下,这里介绍二种办法:

变化动态库

编制程序多少个文本生成so库,当中-shared指生成动态库,-fPIC指生成的库地址无关。
<code>gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so</code>
动用动态库
<code>gcc -o test test.c -L. -ltest</code>
唯独那个时候借使应用ldd可能运转test程序的话,就能够意识前后相继依然运行不了。
<code>crystal@crystal:~/workspace/sotest$ ldd test
linux-vdso.so.1 => (0x00007ffea3b8a000)
libtest.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f095aa14000)
/lib64/ld-linux-x86-64.so.2 (0x00005564bf151000)</code>
以此因为大家个人的so库,并不可能被系统一向识别,供给推行LD_LIBRARY_PATH 依然在/etc/ld.so.conf.d目录下边增多对应的库项。
执行<code>export LD_LIBRARY_PATH=$(pwd)</code>然后再一次运路程序。不过每便都这么会展现很麻烦,那是我们得以把我们放置so的目录增多到/etc/ld.so.conf.d/目录上边去,然后实践ldconfig命令
<code>
crystal@crystal:~/workspace/sotest$ sudo vim /etc/ld.so.conf.d/test.conf
crystal@crystal:~/workspace/sotest$ cat /etc/9159金沙官网,ld.so.conf.d/test.conf
/home/crystal/workspace/sotest
crystal@crystal:~/workspace/sotest$ sudo ldconfig
crystal@crystal:~/workspace/sotest$ ./test
this is in test_a..
this is in test_b..
this is in test_c..</code>

率先供给从官方网址获取安装包:

 

一、

转移静态库

转换对应的多个.o文件
<code>gcc -c test_a.c test_b.c test_c.c </code>
生成libtest.a静态库
<code>ar rcs libtest.a test_a.o test_b.o test_c.o</code>
接受静态库
<code>gcc -o test test.c -static -L. -ltest</code>
然后运维和查看程序
<code>crystal@crystal:~/workspace/sotest$ ./test
this is in test_a..
this is in test_b..
this is in test_c..
crystal@crystal:~/workspace/sotest$ ldd test
不是动态可试行文件</code>
那儿风度翩翩经去除libtest.a文件程序也是足以健康运作的,况且test可执路程序会比任何动态可执行文件大过多。

向来进入5.8的文件夹,找到您对症用药的包就能够。小编接收的是下图的版本:

二、linux下动态库的营造和行使

1、cd /etc

NOTE

****编写翻译参数剖判
**
最要害的是GCC命令行的多少个抉择:-shared 该采纳钦命生成动态连接库(让连接器生成T类型的导出符号表,一时候也生成弱连接W类型的导出符号卡塔 尔(阿拉伯语:قطر‎,不用该标识外界程序无法连接。相当于三个可推行文件

  • -fPIC:表示编写翻译为地点独立的代码,不用此选项的话编写翻译后的代码是岗位相关的之所以动态载入时是经过代码拷贝的办法来满足区别进度的须要,而不能够达到规定的标准真正代码段分享的目标。
  • -L.:表示要一而再的库在当前目录中
  • -ltest:编写翻译器查找动态连接库时有隐含的命名准则,即在付给的名字前边加上lib,前面加上.so来分明库的名目l LD_LIBRARY_PATH:这一个碰到变量提醒动态连接器能够装载动态库的门道。
  • 无可反驳假设有root权限的话,能够改过/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来完结雷同的目标,不过若是未有root权限,那么只可以利用输出LD_LIBRARY_PATH的主意了。
    调用动态库的时候有多少个难点会时常境遇,有的时候,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数辅导,并点名了“-l”的库名,但因此ldd命令察看时,正是坚定找不到你钦命链接的so文件,那个时候你要作的便是经过改动LD_LIBRARY_PATH可能/etc/ld.so.conf文件来钦赐动态库的目录。经常那样做就足以化解库不可能链接的标题了。
    静态库链接时搜索路径顺序:
  • ld会去找GCC命令中的参数-L2. 再找gcc的条件变量LIBRA牧马人Y_PATH3. 再找钦赐目录 /lib /usr/lib /usr/local/lib 那是当场compile gcc时写在前后相继内的
    动态链接时、实践时寻觅路线顺序:
  • 编译指标代码时内定的动态库寻找路线;
  • 景况变量LD_LIBRARY_PATH钦点的动态库搜索路径;
  1. 布置文件/etc/ld.so.conf中钦定的动态库找寻路线;
  2. 私下认可的动态库搜索路线/lib;
  3. 暗中认可的动态库寻找路线/usr/lib。
    关于遭受变量:
    LIBRARY_PATH情况变量:钦定程序静态链接库文件搜索路线LD_LIBRARY_PATH意况变量:内定程序动态链接库文件寻觅路线

9159金沙官网 1

1、动态库的创设

2、vim ld.so.conf

Linux 64位版本

   gcc  -fPIC  -shared    -o  lib库名.so   源文件列表

3、加多你可试行文件的目录,也便是您的依附库的门径,比方:/home/ninetripod/Desktop/test/debug

下载完结后,将职业目录切换来安装包所在的岗位,依次实行:

 

4、配置完后运维ldconfig

# 确定保障安装包具有可实行权限

chmod a+x qt-opensource-linux-x64-5.8.0.run

# 实施安装

./qt-opensource-linux-x64-5.8.0.run

例:

5、再一次用命令实践就可以运行

接下来会不由自主安装指引界面,到此处就跟Windows下安装程序很像了。一路next/skip就能够了。

   gcc   -fPIC  -shared  -o  libmylib.so  max.c  min.c

二、

9159金沙官网 2

 

1、cd /etc/ld.so.conf.d

设置指导界面

2、动态库使用

2、sudo vim exe.conf(新建一个conf文件卡塔尔

等设置到位后,再张开部办事处署。

   gcc    -o  最后的可实践文件  源文件列表  -L 动态库的目录  -l库名

3、在exe.conf里面加多你可推行文件的目录,相当于你的依靠库的渠道,举例:/home/ninetripod/Desktop/test/debug

率先展开default.conf,在命令行中输入:sudo gedit /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf

 

4、完结后实行ldconfig

接下来将qt的设置路线增多进去:

例子:

5、再度实行你的可实行文件就可以运行

# 把*******改为您的家目录名称即可

/home/*******/Qt5.8.0/5.8/gcc_64/bin

/home/*******/Qt5.8.0

已经将int  getMax(int,int)和getMin(int,int)打包在了libmylib.so中了,未来您就可以把libmylib.so复制希望用你的库函数的人了!!

谈到底,安装libgl1-mesa-dev,在命令行中输入:sudo apt-get install libgl1-mesa-dev

 使用你的库函数的人可能回那样使用:

至今能够展开qt creator软件了。

   //test.c

二、安装ffmpeg

          int getMax(int,int);

第一步:是下载ffmpeg: http://ffmpeg.org/releases/,最新版本就可以。

          int main()

其次步:安装重视,运转命令:sudo apt-get -y install libass-dev libfreetype6-dev libmp4lame-dev libtheora-dev libvorbis-dev libopus-dev libx264-dev yasm

{

设置依赖的时候,开掘部分编写翻译教程说的不相同等,这里贴出了作者的,即便这一个能够调换其余的索求。

int x,y;

其三部:编写翻译ffmpeg。首先解压缩,然后cd到解压目录,依次施行:

 int max;

./configure --enable-shared --prefix=/home/*******/ffmpeg

make

makeinstall

scanf(“%d%d”,&x,&y);

第四步:配置。配置是为了实践bin目录下的可推行文件。

max=get马克斯(x,y);//getMax是在您的库函数中曾经落成了的,所以不用外人在促成了,直接拿来用就能够了!!

试行命令: vim /etc/ld.so.conf.d/ffmpeg.conf 

printf(“max=%dn”,max);

加上内容到文件: /home/*******/ffmpeg/lib ,然后保留并脱离

return 0;

施行 sudo ldconfig 使配置生效

}

这几天得以实施 ./ffmpeg -version ,要是不报错就打响了。

 

三、Qt中使用ffmpeg

实施该命令:gcc  -o  test  test.c 会报错:提醒找不到get马克斯;

能够参谋那几个:http://blog.yundiantech.com/?log=blog&id=33

是的的指令:gcc  -o  test test.c  -L libmylib.so存放的目录   -lmylib

自己的布局是那样的:

荒诞的写法:gcc  -o  test test.c  -L libmylib.so存放的目录   -llibmylib.so

INCLUDEPATH += /home/******/ffmpeg/include

              #/home/******/SDL2/include

LIBS += /home/******/ffmpeg/lib/libavcodec.so

        /home/******/ffmpeg/lib/libavdevice.so

        /home/******/ffmpeg/lib/libavfilter.so

        /home/******/ffmpeg/lib/libavformat.so

        /home/******/ffmpeg/lib/libavutil.so

        /home/******/ffmpeg/lib/libswresample.so

        /home/******/ffmpeg/lib/libswscale.so

        #/home/******/SDL2/lib/x86/SDL2.lib

 

有关sdl还未起来研商,先注释掉。

 

将路线全部轮番为相对路线。

翻开动态库中的标号:

将以.lib结尾的文件名改为lib发轫的.so文件名。

readelf  -s  动态库名 

在include的时候,还索要加上extern C标识,因为的是c++的编写翻译器,如下:

 

extern "C"

{

#include "libavcodec/avcodec.h"

#include "libavformat/avformat.h"

#include "libswscale/swscale.h"

#include "libavdevice/avdevice.h"

}

查看可推行文件运营时所重视的动态库:

个中main.cpp的代码如下:

(1)ldd  可执行文件名

9159金沙官网 3

(2)readelf  -d   可试行文件名|grep  Shared

main.cpp

 

末尾,保存,编写翻译,运维。结果如下:

3、动态链接的可实施文件的运作(任选生机勃勃种就能够卡塔 尔(阿拉伯语:قطر‎卡塔尔:化解的是可实行文件在运转时找动态库

9159金沙官网 4

(1卡塔 尔(阿拉伯语:قطر‎将动态库复制到/lib或/usr/lib目录下;(在嵌入式开辟,推荐用此方法!卡塔尔

ffmpeg版本

     命令:

说起底,列出本人参考的非常重要博客:

正确:sudo  cp  libmylib.so  /lib/ 

https://blog.csdn.net/hhrock/article/details/61621044

错误:sudo  cp  libmylib.so  /lib/mylib.so

https://www.cnblogs.com/freeweb/p/6897907.html

错误:sudo  cp  libmylib.so  /lib/libmylib

https://blog.csdn.net/zhangwu1241/article/details/52354604

(2卡塔尔将动态所在目录路线增加到景况变量LD_LIBRARY_PATH

     例如:     

     export  LD_LIBRARY_PATH=动态库所在的目录:$LD_LIBRARY_PATH

     若是急需LD_LIBRARY_PATH平素生效,则需把地方的语句增加到~/.bashrc文件中末尾去。

     命令:

gedit   ~/.bashrc

偷懒的主意(慎用):

echo  export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH>>~/.bashrc

(3) 将动态所在的目录增多到/etc/ld.so.conf中,运行会自动加载/etc/ld.so.conf配文件,如若须求及时生效,施行命令:ldconfig

命令:

sudo gedit  /etc/ld.so.conf

 

三、静态库、动态库使用上的分别

静态库被调用的代码生成可推行文件时会被立刻复制到施行性文件中去;

动态库被调用的代码在可施行文件运行时才会被加载到可实践文件中去。

本文由9159.com发布于操作系统,转载请注明出处:首先我们通过三个文件生成一个对应的so库,1、

关键词:

上一篇:没有了
下一篇:没有了