精华内容
下载资源
问答
  • 编译链接动态库
    千次阅读
    2021-11-15 11:42:42
    alientek@ubuntu16:~/code/256APP/App/Module256App/test$ cat build.sh 
    arm-linux-gnueabihf-g++  TestModule.cpp -I ../include -L ../lib/release -L ./  libModuleSdk.so  -L ./ libHalAPI.so -std=c++11

    -I :指定库的头文件目录
    -L :指定库文件.so 所在目录

    后面接 库名字
    -std=c++11 支持C11

    更多相关内容
  • gcc编译链接动态库

    千次阅读 2022-01-27 10:04:10
    -fPIC: 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。 -shared: 该选项指定生成动态连接(让...


    前言

    以下内容主要作为学习记录,有不准确的地方希望帮忙指出来,谢谢


    以下是本篇文章正文内容,下面示例可供参考

    操作步骤

    1.直接生成目标so文件

    如下图:
    在这里插入图片描述

    部分参数说明

    -fPIC: 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
    -shared: 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件。

    这里没有单独生成 .o 中间文件,直接通过 .cc 文件生成了目标 so 文件。

    2.先生成.o中间文件再链接成目标so文件

    如下图:
    在这里插入图片描述

    可以看到,生成 .o文件时也加了-fPIC,如果不加,后面链接时会报错。一般在写Makefile文件时建议用第二种方式,先生成多个.o文件,最后再链接成目标文件。

    关于-fPIC编译选项可以参考这篇文章
    gcc编译参数-fPIC的一些问题

    总结

    以上就是在Linux下编译链接动态库的简单示例,记录学习过程,供以后参考。
    展开全文
  • gcc编译链接动态库详解

    千次阅读 2015-01-14 16:00:35
    比较详细的介绍了gcc编译链接动态库的原理。 转载: http://kmoving.blog.163.com/blog/static/205049197201267113438532/ 一、GNU gcc的编译工具用法 我们先来写一个简单的C程序:hello.c 1. #include ...

    比较详细的介绍了gcc编译链接动态库的原理。
    转载: http://kmoving.blog.163.com/blog/static/205049197201267113438532/


    一、GNU gcc的编译工具用法


    我们先来写一个简单的C程序:hello.c
    1. #include <stdio.h>
    2.
    3. void print_hello() {
    4. printf("Hello World/n");
    5. }
    6.
    7. int main(int argc, char argv[]) {
    8. print_hello();

    9. return 0;

    10. }


    定义了一个print_hello函数,调用main函数打印Hello World。
    如何编译它呢?
    1. gcc -o hello -O2 hello.c
    -o参数指定生成的可执行程序的文件名, -O2是优化级别。该命令会编译生成hello可执行程序,看看这个文件:ls -l hello
    C代码 复制代码
    1. -rwxr-xr-x 1 robbin users 11939 2008-11-02 13:48 hello
    有11KB大小。


    看看他链接了哪些系统动态链接库,用ldd命令:

    1. ldd hello

    输出信息为:

    1. libc.so.6 => /lib64/tls/libc.so.6 (0x0000002a9566d000)
    2. /lib64/ld-linux-x86-64.so.2 (0x0000002a95556000)


    libc是C语言标准函数库,ld是动态链接器。
    接着我们看看hello这个程序里面有哪些符号,用nm命令:

    1. nm hello

    输出:
    1. 00000000005008f8 A __bss_start
    2. 000000000040043c t call_gmon_start
    3. ......
    4. 00000000004004f0 T main
    5. 0000000000500658 d p.0
    6. 00000000004004e0 T print_hello
    7. U puts@@GLIBC_2.2.5
    8. 0000000000400410 T _start


    中间省略了一些,不过我们还是可以在符号表里面找到函数定义。
    hello有11KB,体积偏大,去处符号表可以给它瘦身,我们用strip命令:

    1. strip hello

    然后再ls -l hello,输出为:

    1. -rwxr-xr-x 1 webuser users 4464 2008-11-02 13:56 hello

    只有4.4KB了,瘦身效果明显! 不过这次符号表再也看不到了,nm hello,输出为:nm: hello: no symbols。


    最后如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令:

    1. strings hello

    输出信息为:


    1. /lib64/ld-linux-x86-64.so.2
    2. SuSE
    3. libc.so.6
    4. puts
    5. __libc_start_main
    6. __gmon_start__
    7. GLIBC_2.2.5
    8. t fff
    9. Hello World


    友情提醒一下,如果你用Java写一个HelloWorld.java,编译以后你也可以用strings窥探一番。


    二、动态共享库怎么使用


    这次我们把hello.c拆开成为两个文件:hello.c和main.c。hello.c的代码是:


    1. #include <stdio.h>
    2.
    3. void print_hello() {
    4. printf("Hello World/n");
    5. }


    而main.c的代码是:


    1. int main(int argc, char argv[]) {
    2. print_hello();
    3. return 0;
    4. }


    hello.c是我们的动态共享库,在hello.c里面我们声明和实现了各种公用的函数,最后main.c可以去调用这些公用函数。首先我们要把hello.c编译成为动态共享库:

    C代码 复制代码


    1. gcc -o libhello.so -O2 -fPIC -shared hello.c

    -fPIC参数声明链接库的代码段是可以共享的,-shared参数声明编译为共享库。请注意这次我们编译的共享库的名字叫做libhello.so,这也是Linux共享库的一个命名的惯例了:后缀使用so,而名称使用libxxxx格式。
    然后编译main.c的时候,我们需要更多的参数让gcc知道如何寻找共享库:

    1. gcc -o main -O2 -L. -lhello main.c

    -L参数指定到哪个附加路径下面去寻找共享库,现在我们指定在当前目录下面寻找;
    -l (L的小写字母)参数指定链接到哪个共享库上面,我们传的参数hello,那么gcc就会自动链接到libhello.so这个共享库上面(注意我们上面说的libXXXX.so命名规则);


    -I ( i 的大写字母)参数指定到哪个附加路径下面去寻找h文件,这个我们没有使用。


    最后我们成功编译好了main,执行一下,报错:

    引用
    ./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory

    找不到libhello.so这个共享库,怎么回事?这是因为libhello.so并不在操作系统默认的共享库的路径下面,我们可以临时指定一下

    链接路径:

    1. export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

    这样就成功了。我们用ldd main看一下:


    1. libhello.so => ./libhello.so (0x0000002a9566d000)
    2. libc.so.6 => /lib64/tls/libc.so.6 (0x0000002a9576e000)
    3. /lib64/ld-linux-x86-64.so.2 (0x0000002a95556000)


    这次main程序链接到了libhello.so这个共享库上面。


    三、关于Linux的动态共享库的设置

    可执行程序找不到要链接的动态共享库,这是Linux上面编译和运行程序很容易碰到的问题,通过上面的小例子,我们已经大致了解共享库的一点基本原理,接下来我们要探讨一下怎么设置程序寻找动态共享库的行为。


    Linux操作系统上面的动态共享库大致分为三类:


    1、操作系统级别的共享库和基础的系统工具库

    比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr /lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6 /lib64目录。此外还可能有其他特定Linux版本的系统库目录。这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。


    2、应用程序级别的系统共享库
    并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数,而在运行的时候自动到/usr/local/lib下面去寻找共享库。


    以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢?因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。这个文件的内容格式


    大致如下:

    1. /usr/X11R6/lib64
    2. /usr/X11R6/lib
    3. /usr/local/lib
    4. /lib64
    5. /lib
    6. /usr/lib64
    7. /usr/lib
    8. /usr/local/lib64
    9. /usr/local/ImageMagick/lib


    假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面,并且希望其他应用程序都可以使用ImageMagick的动态共享库,那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc /ld.so.conf文件里面,然后执行:ldconfig 命令即可。


    ldcofig将搜索以上所有的目录,为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库,我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下:


    1. strings /etc/ld.so.cache | grep ImageMagick

    输出结果为:

    1. /usr/local/ImageMagick/lib/libWand.so.10
    2. /usr/local/ImageMagick/lib/libWand.so
    3. /usr/local/ImageMagick/lib/libMagick.so.10
    4. /usr/local/ImageMagick/lib/libMagick.so
    5. /usr/local/ImageMagick/lib/libMagick++.so.10
    6. /usr/local/ImageMagick/lib/libMagick++.so


    已经成功了!


    3、应用程序独享的动态共享库

    有很多共享库只被特定的应用程序使用,那么就没有必要加入系统库路径,以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变量 LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径,就像我们上面举的那个例子一样,我们可以在应用程序的启动脚本里面预先设置 LD_LIBRARY_PATH,指定本应用程序附加的共享库搜索路径,从而让应用程序找到它。


    具体如下:

    (1)新建自己的头文件路径/home/user/workspace/include和库文件路径/home/user/workspace/lib,这两个目录用来存放我自己编写的头文件和库文件;
    (2)接下来写个头文件和库文件作测试,在/home/user/workspace/include下新建文件test.h,在/home/user/workspace/lib下新建test.c,test.h中是一些函数原型,test.c是函数的实现;
    (3)通过命令gcc -fPIC -shared -o libtest.so test.c在/home/user/workspace/lib生成了一个动态链接库文件libtest.so;
    (4)现在把库文件路径添加进.bash_profile文件,添加内容如下:


    # my code

    C_INCLUDE_PATH=/home/cheney/workspace/include
    export C_INCLUDE_PATH
    LD_LIBRARY_PATH=/home/cheney/workspace/lib
    export LD_LIBRARY_PATH


    然后通过source .bash_profile把.bash_profile文件即时更新了。


    展开全文
  • g++ 编译动态链接库

    千次阅读 2019-08-26 14:41:33
    g++ 编译动态链接库 在linux中动态链接库的后缀为(.so),windows中的...-share指为共享的,-fPIC表示position independent code位置无关,这是动态库特性 -o 指定生成的动态链接库的文件名 -I ./compact_enc_de...

    g++ 编译动态链接库

    在linux中动态链接库的后缀为(.so),windows中的后缀为(.dll)mac 中为(.dylib)

    g++ -shared -fPIC -o ecd.so add.c

    -share指为共享的,-fPIC表示position independent code位置无关,这是动态库特性 -o 指定生成的动态链接库的文件名

    -I ./compact_enc_det/ -I 指定头文件的路径  

    CFLAGS=-Wno-narrowing 忽略-narrowing

    编译器其他变量

     

     

    windows平台可以通过使用 dllexportviewerlv软件查看函数名

    展开全文
  • Linux程序编译链接动态库版本的问题

    千次阅读 2015-08-17 15:40:01
    在实际生产环境中,程序的编译和运行往往是分开的,但只要搞清楚这一系列过程中的原理,就不怕被动态库的版本搞晕。简单来说,按如下方式来做 编译动态库时指定-Wl,-soname,libxxx.so.a,设置soname为libxxx.so.a,...
  • YOLO动态链接库编译和使用 - weixinhum - CSDN博客,YOLO动态链接库编译和使用 - weixinhum - CSDN博客,YOLO动态链接库编译和使用 - weixinhum - CSDN博客
  • 1、动态库*.so的编译 这里我们用到4个文件,它们分别为:SoDemoTest.h、one.cpp、two.cpp、three.cpp。它们的内容如下: SoDemoTest.h #ifndef __SO_DEMO_TEST_HEADER__ #define __SO_DEMO_TEST_HEADER__ #include...
  • Makefile学习笔记06|编译动态链接库

    千次阅读 2022-04-26 11:40:41
    Makefile学习笔记06|编译动态链接库   希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。   动态链接库,就是程序在运行的时候再去加载的代码。因此,在编译时也与一般的代码不同。编译...
  • 在实际开发过程中,当代码的文件较多,可以将一部分代码编译动态库或者静态库然后再加载到程序中使用 编译过程 1、预编译 2、编译 3、汇编 4、链接 静态库和动态库的差异 1、链接静态库简单理解就是复制目标代码...
  • 将静态库编译动态库

    千次阅读 2019-07-12 13:42:12
    最近做一个东西,需要采集硬件设备的音视频数据,然后做编码。以前做过编码部分直接拽过来使用,只写硬件采集部分即可。...编码部分使用ffmpeg4的动态库链接位置自己指定 将硬件采集代码设计为...
  • 静态库链接动态库时,如何使用该静态库

    万次阅读 多人点赞 2016-06-22 18:23:36
    假设libXXX.a用了libpthread.so的函数“pthread_create”,那libXXX.a在链接时,有没有把“pthread_create”函数copy到自己身上,使其完全独立?main.c在链接时,只需要链接libXXX.a,还是连libpthread.so也要链接?...
  • 【CMake】编译链接静态库和动态库

    千次阅读 2021-10-27 10:24:46
    【CMake】编译链接静态库和动态库 【CMake】编译链接静态库和动态库 项目结构 工作原理 配置项目 编译库 项目结构 . ├─include │ └─myClass.h ├─src │ ├─CMakeLists.txt │ └─myClass.cpp └─...
  • 编译动态链接库,windows,linux,mac平台各不相同,从文件上来说,windows下是dll,linux下是so,mac下是dylib;... 这里介绍在mac下手动编译动态库示例: 准备hello.h #ifndef SO_H #define SO_H int add(int a,...
  • 本文的目的是测试各种类型编译后的使用效果,包括链接其他编译方法,使用方法,依赖性等。 太长不看版:请跳至文章最后的总结对比表。 一。内容包含: ①静态libbb.a依赖静态libaa.a的测试; ②...
  • 无聊,遂准备写一篇博客,介绍一下C和C++运行,只因发现工作几年的人对此一知半解的大有人在。    在使用VC构建项目时,经常会遇到下面的链接错误:      初学者面对这些错误常常不知所错:...
  • Qt MinGW调用VS编译动态库(一)

    千次阅读 2020-02-28 20:35:26
    点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多同志最近在封装SDK,想做一个Windows下通用的,比如给出的动态库可以被Qt MinGW版本使用...
  • Qt静态编译 -- 动态链接库搜索路径

    千次阅读 2019-02-24 22:59:06
    陌 上 花 开 由一个问题引出静态编译Qt的必要: 如何在一个系统中编译得到一个qt可执行程序,然后,可以拿到另一个...一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt的,也就是这个程序移到别的没有安装Q...
  • Nginx编译配置脚本篇(9)- 动态库配置脚本auto/lib/conf1、相关文章2、前言3、auto/lib/conf脚本文件详解4、auto/lib/openssl/conf脚本文件详解4.1、OPENSSL的值不为NONE的情况4.2、OPENSSL的值为NONE的情况5、总结...
  • GCC编译链接静态(.a)

    千次阅读 2021-08-10 14:17:51
    1.GCC编译链接静态(.a) (1)生成.o gcc -c a.c b.c c.c (2)链接生成.a(将a.o与b.o链接生成.a) ar rc libaaa.a a.o b.o (3)生成可执行文件c.c中main调用libaaa.a库函数 ...GCC编译链接动态
  • vs2022编译c 动态库,以及调用

    千次阅读 2022-01-08 19:02:22
    一、编译动态库 1.创建动态库项目: 2.修改项目属性: 2.1 修改配置类型为 动态库: 2.2不使用预编译头 2.3 预处理定义,在前面加上 _CRT_SECURE_NO_DEPRECATE; 2.4.如果需要引入头文件,需要添加目录【这里不用...
  • openssl怎么编译动态库

    千次阅读 2019-10-25 17:06:07
    Windows下编译OpenSSL动态库的方法: 1、安装ActivePerl 初始化的时候,需要使用perl 2、使用VS下的Visual Studio 20xx Command Prompt进入控制台模式 3、解压缩openssl的包,通过cd命令切换到openssl的目录 4、执行:...
  • Linux下编译boost动态链接库和静态链接库   1. 先去Boost官网下载需要的Boost版本, 我下载的是boost_1_55_0版本, 然后解压文件。   2. 使用cd命令进入解压后目录: cd boost_1_55_0, 执行下面的命令:  $./...
  • Linux制作动态库和静态库 命名规则 静态库命名规则如下: libxxx.o lib:前缀 .o:静态库 动态链接库(shared object file,共享对象文件)命名规则如下: libxxx.so lib:前缀 .so:动态库 动态库...
  • gcc编译指定动态库路径

    千次阅读 2019-02-26 09:57:34
    看一下gcc编译时常用到的两个参数-l(小写L)和-L 当需要编译的程序中用到了外链(非标准)时,我们在编译时就需要用到-l参数,后面紧跟库名 如果程序用到了多线程...,如果你链接不在这两个路径下,你可以选...
  • 今天要把算法包生成一个动态库放在ARM上调用运行,特此...2、然后编译生成动态库 arm-linux-gnueabi-gcc -shared -fpic -o libSPDU.so *.o -shared 是生成动态库 -fpic 生成位置无关代码 libSPDU.so视自己的情况而定 3
  • 指明需要链接动态库 libmytest.so 7 LIBPATH = -L./dynamiclib/ libs 指明 libmytest.so 的路径 8 #search paths for errorhandler.c 9 vpath %.c ./ comm 10 #下行是为依赖项 apue.h 准备的,比如 ...
  • 自己编译boost动态链接库

    千次阅读 2018-03-23 17:44:56
    经过参考网上的内容,总结如下:点击打开链接动态链接下载(不包括头文件):https://download.csdn.net/download/u013995395/10304357
  • g++编译动态链接编译简单的动态链接库代码与文件格式编译与调用1、生成动态链接库2、编译调用生成的动态库3、添加环境变量路径4、运行编译依赖第三方库(opencv)的动态链接库代码与文件格式编译与调用 编译简单的...
  • Jna调用动态链接库

    万次阅读 2014-12-06 23:09:20
    最近由于工作需要,在和其它系统交互的问题上不仅仅是WebService的交互,还需要利用Java调用其它语言编写的动态链接库,例如编译好的dll文件.好,简单看一下这个问题的来源。 我们的系统和其它系统进行交互的时候...
  • C++编译动态链接库并用python调用

    千次阅读 2022-04-27 18:39:14
    将C++编译动态链接库并用python调用其函数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 242,342
精华内容 96,936
关键字:

编译链接动态库