老样子,不多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可执行文件报错,ffmpeg开发环境布置。 
静态库中的被调用的函数的代码会在编写翻译时一起被复制到可执行文件中去的!!可执行文件在运作不须求静态库的存在!

突发性在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类型的导出符号),不用该标志外部程序不可能连接。也便是3个可执行文件

  • -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的环境变量LIBRAPAJEROY_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

一 、动态库的营造

2、vim ld.so.conf

Linux 64位版本

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

三 、添加你可执行文件的目录,也正是您的信赖库的门径,例如:/home/ninetripod/Desktop/test/debug

下载完结后,将工作目录切换成安装包所在的岗位,依次执行:

 

④ 、配置完后运转ldconfig

# 确定保证卫安全装包拥有可实施权限

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

# 执行安装

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

例:

伍 、再度用命令执行即可运营

然后会并发安装指点界面,到此处就跟Windows下安装程序很像了。一路next/skip就能够了。

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

二、

澳门金沙国际 2

 

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

安装引导界面

二 、动态库使用

② 、sudo vim exe.conf(新建三个conf文件)

等装置完结后,再实行部分布局。

   gcc    -o  最终的可执行文件  源文件列表  -L 动态库的目录  -l库名

③ 、在exe.conf里面添加你可执行文件的目录,也正是你的重视库的门道,例如:/home/ninetripod/Desktop/test/debug

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

 

④ 、实现后实施ldconfig

下一场将qt的装置路径添加进去:

例子:

⑤ 、再一次实施你的可执行文件即可运维

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

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

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

业已将int 
get马克斯(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 libmp5lame-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=getMax(x,y);//get马克斯是在您的库函数中曾经完毕了的,所以不用别人在促成了,间接拿来用就行了!!

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

printf(“max=%d\n”,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

 

最后,保存,编写翻译,运转。结果如下:

三 、动态链接的可执行文件的运维(任选一种即可)):化解的是可执行文件在运作时找动态库

澳门金沙国际 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

 

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

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

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

相关文章