操作系统

当前位置:金沙棋牌 > 操作系统 > 金沙棋牌:ubuntu下生成静态,ffmpeg开发环境配置

金沙棋牌:ubuntu下生成静态,ffmpeg开发环境配置

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-11-22 11:10

老样子,十分少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/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的碰着变量LIBRAXC90Y_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情形变量:钦命程序动态链接库文件寻觅路线

金沙棋牌 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

二、

金沙棋牌 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 libVCDlame-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);//get马克斯是在您的库函数中风流洒脱度落成了的,所以不用外人在贯彻了,直接拿来用就能够了!!

实行命令: 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  可实践文件名

金沙棋牌 3

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

main.cpp

 

终极,保存,编写翻译,运营。结果如下:

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

金沙棋牌 4

(1卡塔 尔(英语:State of Qatar)将动态库复制到/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

 

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

静态库被调用的代码生成可试行文件时会被当即复制到试行性文件中去;

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

本文由金沙棋牌发布于操作系统,转载请注明出处:金沙棋牌:ubuntu下生成静态,ffmpeg开发环境配置

关键词:

上一篇:没有了

下一篇:没有了