精华内容
下载资源
问答
  • 本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。 太长不看版:请跳至文章最后的总结对比表。...④动态库libbb.so依赖动态库libaa.so的测试; ...

    本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。

    太长不看版:请跳至文章最后的总结对比表。

    一。内容包含:

    ①静态库libbb.a依赖静态库libaa.a的测试;

    ②静态库libbb.a依赖动态库libaa.so的测试;

    ③动态库libbb.so依赖静态库libaa.a的测试;

    ④动态库libbb.so依赖动态库libaa.so的测试;

    所用到的文件列表:

    aalib.cpp aalib.h        bblib.cpp bblib.h     main.cpp

    二。源代码:

    aalib.h

    #ifndef AALIB_H
    #define AALIB_H
    #include "stdio.h"
    void helloAA();

    #endif

    ********分割线**************

    aalib.cpp

    #include "aalib.h"

    void helloAA()
    {
        printf(" lib AAAAAAAAAAAAA\n ");
    }

    ********分割线**************

    bblib.h

    #ifndef BBLIB_H
    #define BBLIB_H

    void helloBB();
    void helloAB();

    #endif

    ********分割线**************

    bblib.cpp

    #include "bblib.h"
    #include "aalib.h"

    void helloBB()
    {
        printf(" lib BBBBBBBBBBBBBBBB \n");
    }

    void helloAB()
    {
        printf(" *a*******************\n");
        helloAA();
        helloBB();
        printf(" *b*******************\n");
    }

    ********分割线**************

    main.cpp

    #include "bblib.h"

    int main()
    {
        helloBB();

        helloAB();
    }
     

    三。测试过程

    ①静态库libbb.a依赖静态库libaa.a的测试

    现在生成了静态库libaa.a和libbb.a,下面测试静态库的使用方法:

    可以看到链接静态库的话要指定静态库依赖的静态库,否则编译不过去!由此可见轻易不要链接静态库,因为你也许不知道你要用的静态库还依赖着哪些库.......

    那么将所依赖的静态库编译进静态库呢?试试

    可以看到,使用命令ar rcs libbb.a bblib.o libaa.a并没有起到作用,亦即libaa.a并没有被编译进libbb.a,因此编译可执行程序时还需要链接libaa.a。

    改用下面这种方式编译,可行:

    即编译静态库libbb.a时不要链接libaa.a而是用aalib.o文件,亦即编译静态库链接静态库时不能直接链接静态库,而是用形成该静态库的那些.o文件,可以使用 ar -x libaa.a来获取静态库的所有.o文件(注意:所有.o文件的顺序要对,被依赖的要放后面)。

    ②静态库libbb.a依赖动态库libaa.so的测试

    第一行命令:gcc -o libaa.so -shared -fPIC aalib.cpp

    等价于:gcc -c -shared -fPIC aalib.cpp 加 gcc -o libaa.so -shared -fPIC aalib.o 这两条(注意编译.o时要加选项-shared -fPIC,否则无法生存.so)

    可以看到,编译可执行程序时只链接静态库不链接动态库编译不过去!运行时也需要动态库libaa.so支持

    那么将动态库编译进静态库中呢?试试

    可以看到,虽然编译静态库libbb.a的时候链接了动态库libaa.so,编译可执行程序只链接静态库libbb.a也能编译过去,但是在执行时还是要libaa.so动态库支持。

    ③动态库libbb.so依赖静态库libaa.a的测试

    可以看到编译libbb.so时链接静态库出错,提示静态库需要使用-fPIC选项来编译,那就按照提示的来修改编译命令:

    静态库所需的.o文件使用-shared -fPIC编译,然后在编译动态库的时候链接静态库好用了。并且编译可执行文件时不用链接被依赖的静态库。

    来看一下这个动态库libbb.so依赖哪些库:

    可以看到没有依赖libaa.a这个静态库。

    ④动态库libbb.so依赖动态库libaa.so的测试

    动态库链接动态库成功,并且编译可执行文件时也不用链接被依赖的库,但是运行时还是要两个动态库支持。

    四。总结

    被依赖的库aa编译库aa的命令直接库bb编译库bb的命令编译可执行程序的命令编译时是否需要库aa运行时是否需要库aa
    libaa.a

    gcc -c aalib.cpp

     ar rcs libaa.a aalib.o

    libbb.agcc -c bblib.cpp                                ar rcs libbb.a bblib.ogcc -o out main.cpp libbb.a libaa.a需要不需要
    libaa.agcc -c aalib.cpp      ar rcs libaa.a aalib.olibbb.agcc -c bblib.cpp                               ar rcs libbb.a bblib.o aalib.ogcc -o out main.cpp libbb.a 不需要不需要
    libaa.sogcc -o libaa.so -shared -fPIC aalib.cpplibbb.agcc -c bblib.cpp                               ar rcs libbb.a bblib.o libaa.sogcc -o out main.cpp libbb.a不需要需要
    libaa.agcc -c aalib.cpp      ar rcs libaa.a aalib.olibbb.sogcc -o libbb.so -shared -fPIC bblib.cpp libaa.a编译libbb.so就出错,无法编译成动态库  
    libaa.agcc -c -shared -fPIC aalib.cpp               ar rcs libaa.a aalib.olibbb.sogcc -o libbb.so -shared -fPIC bblib.cpp libaa.agcc -o out main.cpp -L./ -lbb不需要不需要
    libaa.sogcc -o libaa.so -shared -fPIC aalib.cpplibbb.sogcc -o libbb.so -shared -fPIC bblib.cpp -L./ -laagcc -o out main.cpp -L./ -lbb不需要需要

    其他说明:链接静态库时要注意顺序,使用第二行的方法编译直接库libbb.a的时候用到被依赖库的.o文件,注意些个.o文件的依赖顺序也很重要,不能错,被依赖的要放后面。另外:编译好的动态库要指定路径,否则运行时找不到动态库的位置。

    五。结论

        由于本测试的初衷是找出一种方法使得编译可执行程序时不链接那些被依赖的库,因此第二行和第五行的组合可以作为备选方案。

    展开全文
  • QT下生成动态库并链接动态库

    千次阅读 2019-05-21 13:33:17
    QT下生成动态库并链接 请测有效 Qt下生成动态库,参考文章: https://www.cnblogs.com/boright88/p/6263137.html Qt下链接动态库,参考文章: https://blog.csdn.net/yanmanm/article/details/82704651 1、 qt下生成...

    QT下生成动态库并链接

    请测有效

    Qt下生成动态库,参考文章: https://www.cnblogs.com/boright88/p/6263137.html

    Qt下链接动态库,参考文章: https://blog.csdn.net/yanmanm/article/details/82704651

    1、 qt下生成动态库

    (1)、新建库。文件à新建文件及项目à库(Library)
    à选择共享库并输入库名称à一直点击下一步直到填写类信息à为类命名à点击完成。

    (2)、点击项目à取消影子文件的勾。

    (3)、查看库文件所在目录下是否生成两个.h和一个.cpp文件。

    (4)、在*.h文件中加入自己的功能函数。

    (5)、点击构建。

    (6)、查看库文件所在目录下的debug或release里是否有.dll文件。有则成功生成动态库。

    2、 qt动态库的链接

    新建widgets项目.

    (1)、qt显示调用动态库(较麻烦,lib文件不存在)

    (2)、qt隐示调用动态库(需要.lib文件的存在)

       1、如1.2的方法去掉新建项目的影子目录.
    
       2、将库文件的.dll .lib .h三个文件拷贝到新建widgets.
    
       3、对项目点击”添加库”->外部库->并浏览到.lib文件目录点击完成.
    
       4、初始化库对象实例.并调用方法.
    
    展开全文
  • 进行动态库编译,链接动态库 -Ldir 在动态库的搜索路径中增加dir目录 -lname 链接静态库(libname.a)或动态库(libname.so)的库文件 -fPIC(或fpic) 生成使用相对地址无关的目标代码 方法一...

    gcc常用编译选项:

    选项

    含义
    -static链接静态库,禁止使用动态库
    -shared进行动态库编译,链接动态库
    -Ldir在动态库的搜索路径中增加dir目录
    -lname链接静态库(libname.a)或动态库(libname.so)的库文件
    -fPIC(或fpic)生成使用相对地址无关的目标代码

    方法一:

    第一步:使用-shared参数生成动态库,gcc -shared -fPIC -o libtest.so test.c     然后把libtest.so复制到/usr/lib64/系统路径下

    注意:生成的动态库的名字必须是lib+名字.so,之后可以直接使用-ltest来引用动态库。

    第二步:编译main.c,使用libtest.so动态库,gcc -o main main.c -L/usr/lib64/ -ltest

    方法二:

    在编译main.c,并链接libtest.so的时候,直接指定使用当前目录下的libtest.so文件,

    使用命令:gcc -o main main.c ./libtest.so

    展开全文
  • Linux动态库依赖其它动态库的问题

    千次阅读 2019-11-15 11:17:45
    1 前言 这两天在编写一个插件系统Demo的...这个报错翻译过来就是没有在命令行中指定该动态库。 这个报错就很搞事了,你说你明明知道需要哪个库,为什么不直接帮我链接呢,非得我显示的在命令行中指定呢? 2 现象描...

    1 前言

    这两天在编写一个插件系统Demo的时候,发现了个很奇怪的问题:插件加载器中已经链接了ld库,但是应用程序在链接插件加载器的时候,却还需要显式的来链接ld库。否则就会报:DSO missing from command line。这个报错翻译过来就是没有在命令行中指定该动态库
    这个报错就很搞事了,你说你明明知道需要哪个库,为什么不直接帮我链接呢,非得我显示的在命令行中指定呢?

    2 现象描述

    问题可以简单描述为:当链接可执行文件时,依赖于libA.so,而libA.so又依赖于libB.so,而且可执行文件中还直接调用了libB.so中的函数,那么此时链接就会出现错误。

    2.1 问题发生的前置条件

    • libA.so在编译过程中显式的链接了libB.so
    • 可执行文件中使用了libB.so的函数
    • binuntils版本 ≥ 2.22

    2.2 Talk is cheap. Show me the code

    话不多说,先看看可以复现改问题的代码吧

    libB.so的源码:

    #include <stdio.h>
    
    int funB1(){
    
        printf("in funB1");
    
        return 0;
    }
    
    int funB2(){
    
        printf("in funB2");
    
        return 0;
    }
    
    

    这里面有两个函数:funB1funB2
    其中funB1函数会被libA调用,而funB2会被可执行文件调用。

    编译libB.so:

    $ gcc libB.cpp -fPIC -shared -o libB.so
    

    libA.so的源码:

    #include <stdio.h>
    
    int funB1();
    
    int funA1(){
    
        printf("in funA1 \n");
    
        funB1();
    
        return 0;
    }
    

    该库中只有一个函数funA1,该函数在内部调用了libB中的funB1函数。且该函数会被可执行文件调用。

    编译libA.so:

    $ gcc libA.cpp -fPIC -shared -o libA.so -Wl,-rpath=./ -L./ -lB
    

    main.cpp的源码:

    int funA1();
    int funB2();
    
    int main(){
    
        funA1();
        funB2();
    
        return 0;
    }
    

    编译main.cpp:(复现错误的编译方法)

    gcc main.cpp -L./ -lA
    

    当我们按照上面的指令编译main.cpp的时候,便报错了。

    /usr/bin/ld: /tmp/ccDQXTKy.o: undefined reference to symbol '_Z5funB2v'
    .//libB.so: error adding symbols: DSO missing from command line
    collect2: error: ld returned 1 exit status
    
    

    (问号.jpg)这,这GCC不是搞事吗,你明明知道我需要连接libB.so为啥就不帮我链接上去呢?难道我libA.so没有指明要使用libB.so?我们使用下面的指令来看一下

    $ ldd libA.so
    

    得到如下信息:

    	linux-vdso.so.1 =>  (0x00007ffd09def000)
    	libB.so => ./libB.so (0x00007fc513d7d000)
    	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc5139b3000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007fc514181000)
    
    

    明明libA.so已经显式的指明我要依赖libB.so了,那为啥在编译main.cpp的时候链接了libA.so,GCC却还要我们显式的链接libB.so呢?

    3 答案

    答案很简单,那就是GCC就是想要你显式链接呗。(你是编译器,你牛好吧。)那这是为啥呢?
    官方一点的答案就是,自从binutils 2.22版本以后,如果你在程序中使用了你依赖的动态库所依赖的动态库中的函数时,你就必须显式的指定你依赖的动态库所依赖的动态库。

    说那么多,我们更想知道的是,通过修改什么参数可以解决这个问题呢?因为你可能不想在编译程序的时候要把动态库所依赖的所有动态库都显示链接一遍。

    4 究极答案

    实际上,这是binutils在2.22版本以后,默认把--no-copy-dt-needed-entries这个选项打开了。当打开了这个选项的时候,编译器在链接的时候是不会递归的去获取依赖动态库的依赖项的,于是就会出现上述的问题。关于该配置项的详细说明如下:

       --copy-dt-needed-entries
       --no-copy-dt-needed-entries
           This option affects the treatment of dynamic libraries referred to by DT_NEEDED tags inside ELF dynamic libraries mentioned on the command line.  Normally the linker won't add a DT_NEEDED
           tag to the output binary for each library mentioned in a DT_NEEDED tag in an input dynamic library.  With --copy-dt-needed-entries specified on the command line however any dynamic
           libraries that follow it will have their DT_NEEDED entries added.  The default behaviour can be restored with --no-copy-dt-needed-entries.
    
           This option also has an effect on the resolution of symbols in dynamic libraries.  With --copy-dt-needed-entries dynamic libraries mentioned on the command line will be recursively
           searched, following their DT_NEEDED tags to other libraries, in order to resolve symbols required by the output binary.  With the default setting however the searching of dynamic
           libraries that follow it will stop with the dynamic library itself.  No DT_NEEDED links will be traversed to resolve symbols.
    

    大概意思就是,跟在--no-copy-dt-needed-entries它后面的库都不会遍历其依赖项,使用--copy-dt-needed-entries则相反。也就是使用下面的指令来编译mian.cpp就可以避免该问题了。

    $ gcc main.cpp -L./ -Wl,--copy-dt-needed-entries -lA
    

    题外话

    在Linux的ELF文件中,如果依赖于其他的动态库,那么改ELF文件会存在一个.dynamic的段,这个段里面会记录其依赖的动态库信息,其标志位为DT_NEEDED。

    5 参考文档

    1,DSO missing from command line原因及解决办法:https://segmentfault.com/a/1190000002462705
    2,折腾gcc/g++链接时.o文件及库的顺序问题: https://www.cnblogs.com/OCaml/archive/2012/06/18/2554086.html#sec-1-4-1

    展开全文
  • vs生成动态库及使用动态库

    千次阅读 2017-05-25 21:51:30
    动态库(.dll):动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可...
  • VS2010 中编写动态库和调用动态库

    千次阅读 2018-11-12 23:05:42
    ... VS2010 中编写动态库和调用动态库 百度查了一下在VS中编写动态库的方法,亲测有效。 (1)启动VS2010》文件》新建》项目,按下图进行选择填写,选择Win32控制台应...
  • 什么是软件动态库?软件安装号之后如何检查动态库是否正确?手机软件安装之后会有动态库吗?
  • 通俗理解动态库与静态库区别

    万次阅读 多人点赞 2019-06-21 15:27:46
    引:最近做了算法产品化相关的一些工作,其中涉及到算法库封装的相关工作,封装为动态库。总结动态库和静态库区别和对应使用原则。 区别:静态库和动态库最本质的区别就是:该库是否被编译进目标(程序)内部。 ...
  • jna对于动态地址的动态库的加载

    万次阅读 2020-05-15 11:23:13
    动态库的接口,里面只写动态库的调用方法 public interface CaautooutMap extends Library { String calculate(String intput_data); //main的调用,在main方法中就可以指定动态库的加载地址 public static void ...
  • 在VS2015中静态加载动态库时,需要将库文件(DLL)拷贝到调用程序所在的路径下,如果所需动态库较多时,就会非常麻烦。可以在项目中指定应用程序搜索动态库的路径,这样就无需再将动态库文件进行拷贝了。 可以通过两...
  • 编了一个动态库,写测试程序去调用动态库,程序编译通过,调用动态库里函数出错,通过加上动态库相关依赖库以及 extern“C”声明解决该错误   以下,详细说明解决经过: 首先,刚编译好的动态库需要配置好配置...
  • 4 动态库的加载及调用 动态库的加载分为静态加载、动态加载两种方式。 4.1 静态加载动态库 静态加载动态库的步骤包括:设置项目附加库目录;设置项目附加依赖项;移动DLL文件以及声明动态库的导出函数。 创建...
  • iOS制作动态库

    千次阅读 2019-03-04 18:55:38
    库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名。 动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。 静态库与动态库的区别 静态库:链接时会被完整的复制到可执行文件中,被多次使用...
  • 创建一个动态库 MyDynamicFramework: 创建一个测试类: 在 MyDynamicFramework.h(默认生成,可统一暴露头文件) 中 #import “Person.h”: #import <UIKit/UIKit.h> //! Project version number ...
  • VS动态库调试方法

    千次阅读 2018-12-04 16:49:20
    1 将动态库与调用动态库的程序放在同一解决方案下 打开调用动态库的程序,之后在“解决方案资源管理器”中,选中“解决方案’XXX’”,之后在右键菜单中选择“添加-&gt;现有项目”,之后在“添加现有项目”...
  • 问题:QtEmbedded-4.8.6-arm 编译选择从 动态库到静态库 时,发现的一个疑惑:,生成的Makefile链接库路径下如果有动态库和静态库,优先选择动态库编译应用 具体现象: 我最初是使用动态库的 QtEmbedded-4.8.6-...
  • C++静态库和动态库用法

    千次阅读 多人点赞 2018-07-19 23:50:11
    从事软件工作也有两年了,C++静态库和动态库也用了不少,但都是依葫芦画瓢,一直没具体去研究一下二者的区别,加载方式等,今天花时间看了几篇博客,重新学习了一下,做出如下笔记。 2、定义 静态库和动态库从字面意思来...
  • C++静态库与动态库

    千次阅读 2016-10-20 09:50:56
    这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养...
  • 动态库类的创建(适用初学者)(该博客是本人学习过程中自行总结,如有错误,还请斧正)(内含函数,常量的动态库生成与调用)我的环境是VS2005创建步骤:文件-&gt;新建-&gt;项目:win32控制台应用程序默认创建DLL在...
  • 假设程序test依赖动态库b,而动态库b依赖动态库a。 在编译test的时候,我们希望的是只指定b,而不用指定a,因为我们不希望知道a的依赖库有哪些,只需关心b。那么我们采用这样的思路去编译test的时候,是会报错的。...
  • C/C++动态库加载

    千次阅读 2019-07-11 15:44:37
    C/C++动态库加载动态库动态库加载方式链接加载动态加载dlopendlsymdlclosedlerrorextern 'C'参考end 动态库 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用...
  • 在编写一个动态库时,可能会引用一些第三方的动态库。而在非开发环境中运行时,必须拷贝所有依赖的动态库,否则程序无法运行。我们可以通过ldd命令查看依赖的动态库信息,但一个个查看,拷贝十分繁琐。而且如果依赖...
  • Qt动态库的链接问题

    千次阅读 2018-03-04 11:13:44
    Qt中引用动态库动态库有两个文件,一个是.lib链接文件,一个是.dll动态库文件, 在Qt pro文件引用的时候 LIBS += -L../lib -lReceiver 这个表示lib文件在工程文件的上一层目录中的lib文件夹中,只需要将.lib...
  • linux加载动态库问题

    千次阅读 2018-09-10 16:12:03
    当我们在linux系统引用动态库时,经常会遇到一个问题,加入我们需要的动态库没有在系统的默认目录下,我们编译时使用-L指定了动态库的路径,编译时没有问题,但是执行调用该动态库的可执行文件时,却提示找不到动态...
  • Java动态库调用

    千次阅读 2015-08-21 15:50:33
     JNI调用动态库: JNI是安装JDK的时候自带的内容,适用场景为开发前就知道动态库需要供Java程序调用,且需要Java程序提供动态库开发的头文件内容。使用相对复杂,且如果是对于已经存在的动态库需要开发中间库来适配...
  • Linux 动态库的编译和使用

    千次阅读 2019-09-28 21:07:03
    动态库又叫动态链接库,是程序运行的时候加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态库是目标文件的集合,目标文件在动态库中的组织方式是按特殊的方式组织形成的。在动态库中...
  • 理解静态库与动态库 静态库 概念 静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库 ...
  • 动态库(共享库)的创建在Qt Creator中新建项目,选择Library 点击“Choose”进入下一步选择创建库的类型:共享库选择Kit套件选择需要的模块配置工程路径、名字等Qt Creator自动创建的文件我配置的动态库名字为:...
  • 最近需要搞懂一个事情,就是QT如何用使用动态库。我们需要解决以下几个问题: 1.有时候我们不希望在当前工程下设计界面,而是希望把界面做成一个动态链接库,然后主程序调用这个动态链接库,然后主程序把这个动态库...
  • docker for windows调取dll动态库

    万次阅读 2019-12-26 15:52:48
    本次docker的环境是安装在win10系统,在docker容器内部访问dll动态库文件 一、本次项目的服务节点是多模块协作的,需要在每个容器中运行一个服务节点,所以需要部署多个docker,最后用k8s统一管理 1、win10环境下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 950,941
精华内容 380,376
关键字:

动态库