首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux编译so库「建议收藏」

/so 表示当前路径的上一层目录的so子文件夹中) -l参数:指明要连接的库的名字,如-ltest 表示要链接libtest.so库 三、运行main 现象:运行出错,报错信息: error while...libaston.so,如果加载失败则会打印以上错误信息。...系统加载so库的思路: ①首先到LD_LIBRARY_PATH这个环境变量所指定的目录下去寻找 ①如果找不到,再去/usr/lib, /lib等专门存放库的目录下寻找 解决方法一: 将libtest.so...(cp libtest.so /usr/lib即可) 解决方法二: 使用环境变量LD_LIBRARY_PATH。将libtest.so所在目录导出到LD_LIBRARY_PATH即可。...如:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/winshare/so_test 补充:ldd命令 作用:查看一个可执行程序使用了哪些共享库,

3.5K40

【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

在Linux下,共享库的加载是由/lib/ld.so完成的,ld.so加载共享库时,会从ld.so.cache查找。 创建函数库示例 我们通常把一些公用函数制作成函数库,供其它程序使用。.../hello 会提示出错,因为虽然连接时用的是当前目录的动态库,但是运行时,是到/usr/lib中找库文件的,将文件libmyhello.so复制到目录/usr/lib中就OK了。...那么在产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。...(因为so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)。...编译目标代码时指定的动态库搜索路径 2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径 3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径 4.

5.5K52
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux下关于动态库的说明 | 编译以及调用

    动态库是一种在已经编译完毕的程序开始启动运行时,才被加载来调用其中函数的库。其加载方式与静态库截然不同。...即,程序与静态库编译链接后,即使删除静态库文件,程序也可正常执行。 ​ 动态库正好相反,在编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。...即,程序只在执行启动时才加载动态库,如果删除动态库文件,程序将会因为无法读取动态库而产生异常。...W类型的导出符号),不用该标志外部程序无法连接。...:    然后再输入:export    即会显示是否设置正确    export方式在重启后失效,所以也可以用 vim /etc/bashrc ,修改其中的LD_LIBRARY_PATH变量。

    2.2K40

    Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH的区别

    昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错。...2 Google上查找 /usr/bin/ld: cannot find -l* 的出错原因 gg了很久gcc ld链接动态库出错的原因,结果还是没找到理想的答案。...于是重新搜索了gcc LD_LIBRARY_PATH的作用,竟然发现gcc在编译链接时链接的动态库跟LIBRARY_PATH有关而跟LD_LIBRARY_PATH没关系!...4.1 Linux gcc编译链接时的动态库搜索路径 GCC编译、链接生成可执行文件时,动态库的搜索路径就包含LIBRARY_PATH,具体的搜索路径顺序如下(注意不会递归性地在其子目录下搜索): 1、...4.2 执行二进制文件时的动态库搜索路径 链接生成二进制可执行文件后,运行该程序加载动态库文件时就会搜索包含LD_LIBRARY_PATH路径下的动态库,具体顺序如下: 1、编译目标代码时指定的动态库搜索路径

    89810

    静态库和动态库制作

    使用动态库会将动态库加载到内存,10 个文件也只需要加载一次,然后这些文件用到库的时候临时去加载,速度慢一些,但是很省内存。.../test 出错原因分析: 连接器: 工作于链接阶段,工作时需要 -l 和 -L 动态链接器: 工作于程序运行阶段,工作时需要提供动态库所在目录位置 解决办法:指定动态库路径并使其生效,然后再执行文件...4、指定动态库路径并使其生效 通过环境变量指定动态库所在位置: export LD_LIBRARY_PATH=动态库路径 export LD_LIBRARY_PATH=./ ..../bashrc 永久生效方法: vi ~/.bashrc 写入 export LD_LIBRARY_PATH=动态库路径 保存 source ~/.bashrc,再重启终端 —> 让修改后的 .bashrc...可以控制何时加载动态库 加载速度比较慢 发布程序时需要提供依赖的动态库

    24120

    在linux下制作静态库和动态链接库的方法

    ============================================ 动态库 并不包含在可执行文件中 在执行时才加载动态库 制作 gcc -shared -fPIC xxx.c...-o libxxx.so 编译 gcc main.c -l xxx [-L 编译时库路径] 临时指定运行时的库查找路径 [LD_LIBRARY_PATH=(运行时库路径)] ....让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。...相当于一个可执行文件 -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。...:表示要连接的库在当前目录中 -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称 LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径

    3.2K20

    LD_LIBRARY_PATH和LIBRARY_PATH的区别

    时加入目标文件或加载时或运行时(动态共享库)被动态的加载到内存并执行; 可执行(Executable)文件:由链接器生成,可以直接通过加载器加载到内存中充当进程执行的文件。...静态库的优点在于: 程序员不需要显式的指定所有需要链接的目标模块,因为指定是一个耗时且容易出错的过程; 链接时,连接程序只从静态库中拷贝被程序引用的目标模块,这样就减小了可执行文件在磁盘和内存中的大小。...链接的时机: 编译时,就是源代码被编译成机器代码时(静态链接器负责); 加载时,也就是程序被加载到内存时(加载器负责); 运行时,由应用程序来实施(动态链接器负责)。...设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录): export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径...,经常会需要使用某个或某些动态链接库,为了保证程序的可移植性,可以先将这些编译好的动态链接库放在自己指定的目录下,然后按照上述方式将这些目录加入到LD_LIBRARY_PATH环境变量中,这样自己的程序就可以动态链接后加载库文件运行了

    1.3K40

    weblogic.nodemanager.common.ConfigException: Native version is enabled but nodemanager native librar

    近日在一个原本工作正常的weblogic web server(操作系统为redhat 64位系统)上折腾安装redis/hadoop等东东,yum install了一堆第3方类库后,重启weblogic...时,发现nodemanager无法启动了,报错如下: 严重: Fatal error in node manager server weblogic.nodemanager.common.ConfigException...        at weblogic.nodemanager.server.NMServerConfig.initProcessControl(NMServerConfig.java:243) 从出错信息上目测...,是nodemanager加载native本地库时,版本不匹配,网上搜索了一圈,找到了解决办法: 添加环境变量LD_LIBRARY_PATH路径为: ...  ...MW_HOME=/opt/app/Oracle/Middleware  export BASE_DOMAIN=$MW_HOME/user_projects/domains/base_domain export LD_LIBRARY_PATH

    86870

    深入浅出链接库 | 静态库与动态库

    链接库就是指将库文件编译后打包为一个二进制文件,这些二进制文件会在程序调用的时候加载到内存中。实际上,一个或多个源文件编译为目标文件后,这个文件中所引用的外部的符号需要通过链接来找到这部分缺失的地址。...静态链接库 静态库会直接加载到代码段,他和所有的目标文件一起链接成可执行文件,生成可执行文件后可以独立运行。...动态库的制作 ① 编译生成与位置无关的 .o 文件 动态共享库是在运行的时候才加载的,它加载到内存的共享库段,用完后就释放,所以要编译为与位置无关的。.../header/ (2)“加载共享库出错”的解决方法 这个是时候,虽然我们已经生成了可执行文件,但是当我们运行可执行文件的时候,可能会出现这样的错误 我们可以通过命令 ldd 来查看一下可执行文件的链接情况...ld.so加载器及配置文件ld.so.conf:指定动态链接库的搜索路径(也可以通过配置环境变量$LD_LIBRARY_PATH 来指定程序运行时的动态库.so文件的搜索路径)。

    63210

    吴章金: 如何创建一个*可执行*的共享库

    ,协同可执行文件创建进程映像 Core dump(core),运行过程中崩溃时自动生成,用于调试 我们来看中间两类: 可执行文件 如果不引用外部库函数,那么所有符号地址是确定的,执行加载后可直接运行 共享库...如果可执行文件用到外部库函数,那么需要通过动态链接器加载引用到的共享库并在运行时解析用到的相应符号 所以,前者和后者通常情况下是独立存在的,是联合行动的,两者差异明显: 可执行文件有标准的 C 语言程序执行入口...main,而共享库则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址在链接时是相对的,在装载时动态分配和计算符号地址 接下来做个实验具体看看两者的区别,准备一个“烂大街”的.../libhello.so Segmentation fault (core dumped) 直接执行失败,再试试如何生成一个可执行文件来加载运行它,这个是引用共享库的通常做法: $ gcc -m32 -.../libhello.so hello 也可以当共享库使用: $ gcc -m32 -o hello.noc -L./ -lhello $ LD_LIBRARY_PATH=$LD_LIBRARY_PATH

    1.1K20

    怎样在 Linux 中使用动态和静态库

    这些共享库在应用启动前被载入内存,当多个应用都需要同一个库时,这个库在系统中只会被加载一次。这个特性减少了应用的内存占用。...另外一个值得注意的地方是,当一个共享库的 bug 被修复后,所有引用了这个库的应用都会受益。...在本例中,正确的版本就在这个目录下,所以你可以导出它至环境变量: $ LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH $ export LD_LIBRARY_PATH 现在动态链接器知道去哪找库了...动态加载 动态加载的意思是一个库(例如一个 .so 文件)在程序的运行时被加载。这是使用某种特定的编程方法实现的。 当一个应用使用可以在运行时改变的插件时,就会使用动态加载。...unset LD_LIBRARY_PATH sudo cp libmy_shared.so /usr/lib64/ 当你运行 ldd 时,你现在可以看到归档库的路径被展示出来: $ ldd my_app

    2K21

    【linux命令讲解大全】198.Shell命令解析:export和exportfs的用途和参数解释

    # export -pf # 首先删除要演示的变量名 # unset a b # 定义变量的同时增加导出属性 export a b=3 # 当然也可以先定义后增加导出属性 b=3 export b #...:$PATH # 添加当前位置到动态库环境变量 export LD_LIBRARY_PATH=$(pwd):${LD_LIBRARY_PATH} 错误用法 对未定义的函数添加导出属性。...对没有导出属性的函数/变量执行删除导出属性操作。 在 -- 后使用选项。 Q&A Q:对变量或函数设置导出属性有什么用?...之前的不会影响,之后的除非是修改了 ~/.bashrc 这种启动终端时加载的脚本。 Q:我脚本文件中调用 ~/.bashrc 中定义的函数和变量。...当共享或者取消共享时,显示在做什么。 显示当前共享列表的时候,同时显示共享的选项。

    45910

    C 调用 Go 动态库

    使用 GCC 编译器时,需要指定 Go 共享库所在的路径,并通过 -L 选项告诉 GCC 去哪里查找库文件,使用 -l 选项指定库的名称。...-pthread:启用多线程支持,C 程序和 Go 程序共享同一线程池时需要此选项。-ldl:动态加载库,需要链接 dl 库来处理动态库加载。...-Wl,-rpath ,将共享库搜索路径嵌入到可执行文件中。这意味着程序在运行时会自动去指定的目录查找共享库,而不需要设置 LD_LIBRARY_PATH 环境变量。6....运行 C 程序完成编译后,运行 C 程序以调用 Go 动态库:$ ./main# 执行 C 程序后,输出将会显示 Go 中 `Add` 函数的返回结果:Result of Add: 57....注意事项在 Go 中使用 //export 注释导出函数,以便 C 程序能够调用它们。在 Go 动态库编译时,不需要定义 main() 函数,因为生成的库文件不需要主函数来启动。

    9310

    【linux命令讲解大全】065.深入了解export命令:设置导出属性与环境变量管理

    # export -pf # 首先删除要演示的变量名 # unset a b # 定义变量的同时增加导出属性 export a b=3 # 当然也可以先定义后增加导出属性 b=3 export b.../bin:$PATH # 添加当前位置到动态库环境变量 export LD_LIBRARY_PATH=$(pwd):${LD_LIBRARY_PATH} 错误用法 对未定义的函数添加导出属性。...对没有导出属性的函数/变量执行删除导出属性操作。 在 -- 后使用选项。 Q&A Q:对变量或函数设置导出属性有什么用?...A:它们会成为环境变量,可以在脚本中访问它们,尤其是脚本中调用的子进程需要时。(参考链接4) Q:如果我编写的脚本修改了已有的环境变量的值,那么执行它会在当前终端生效吗?...之前的不会影响,之后的除非是修改了 ~/.bashrc 这种启动终端时加载的脚本。(参考链接1) Q:我脚本文件中调用 ~/.bashrc 中定义的函数和变量。

    23810

    C语言 | 什么是静态链接库和动态链接库?

    然后当应用程序在内存中执行时,运行时环境发现它调用了一个动态库中的库函数时,会去加载这个动态库到内存中,然后以后不管有多少个应用程序去调用这个库中的函数都会跳转到第一次加载的地方去执行(不会重复加载)。...这个.a文件就是静态库文件,lib后面的是库文件名称。制作出来了静态库之后,发布时只需要发布.a文件和.h文件。以上就是静态链接库的制作过程。...编译完之后可以得到一个.so文件,这个文件就是动态链接库文件。做库的人给用库的人发布库时,发布libxxx.so和xxx.h即可。 对于动态链接库,该怎么使用呢?...操作系统在加载固定目录/usr/lib之前,会先去LD_LIBRARY_PATH这个环境变量所指定的目录下去寻找,如果找到就不用去/usr/lib下面找了,如果没找到再去/usr/lib下面找。...所以解决方案就是将libaston.so所在的目录导出到环境变量LD_LIBRARY_PATH中即可。

    4.6K40

    深度解析Linux中的编译器gccg++

    形成的可执行程序里面的static的体积比较大, 动态链接就是将库的地址拷贝到我们的可执行程序里面,动态库也称之为共享库 动态库不能缺失,不然得话会导致所有的程序运行出错的 静态链接:将我们要的库方法实现...静态库 特点: 静态库在编译时被直接嵌入到可执行文件中,生成的二进制文件是独立的。 文件后缀通常为 .a。...:$LD_LIBRARY_PATH # 指定动态库路径 ./output LD_LIBRARY_PATH 环境变量指定动态库的查找路径。...三、动静态库的选择 对比项 静态库 动态库 文件大小 可执行文件较大,库内容嵌入其中 可执行文件较小,运行时需要库文件支持 运行效率 加载速度更快,无需查找库文件 运行时加载,可能略慢 共享能力 不支持共享...检查动态库是否导出特定符号: objdump -T libmylib.so | grep symbol_name 添加动态库路径到系统默认: 将动态库路径添加到 /etc/ld.so.conf,然后运行

    13510

    【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    VLC 模块加载 : VLC 除了一个 核心 Core 之外, 还有几百个模块(Module), 根据需要加载不同模块, 介绍地址 点击打开链接; -- 6....14.04.1 LTS 版本, 32 位 操作系统, 其它版本请自行摸索; -- 注意 : 一定要是 32 未的操作系统, 64 位操作系统无法编译 VLC 源码(一些编译工具如果不是 32 位的会出错...-- m4 : 宏处理器.将输入拷贝到输出,同时将宏展开; -- patch : 制作 patch 文件的必要工具; -- pkg-config : 提供从源代码中编译软件时查询已安装的库时使用的统一接口的计算机软件...=$LD_LIBRARY_PATH:/usr/local/lib 2...., 当媒体正在播放的时候, 如果触摸子组件, 触发事件, 会影响播放, 此时我们需要拦截这些触摸事件; -- EqualizerBar 介绍 : 继承 LinearLayout, 均衡器调节条; --

    4.9K40

    咱不知道的动态链接库小细节

    借用《深入理解计算机系统第3版》中的话来说: 共享库是一个目标模块,在运行或加载时,可以加载到任意的内存地址,并和一个在内存中的程序链接起来。...因此在上述fun.h中,其声明导出的have_fun函数前面啥也没有加。 动态链接库在寻找的时候有没有顺序 当然是有顺序的!...例如 export LD_LIBRARY_PATH=path/to/lib/:$LD_LIBRARY_PATH 然后你的程序就会按照这个路径找需要的动态库。...补充下动态链接库的寻找顺序: 1.编译目标代码时指定的动态库搜索路径; 2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径; 3.配置文件/etc/ld.so.conf中指定的动态库搜索路径...链接后编译完成之后,当这个程序运行的时候.so也是要必须在场的(在linux中,例如用LD_LIBRARY_PATH环境变量设置动态链接库的查找地址),要不然程序会找不到这个.so而无法运行。

    93130
    领券