动态库链接注意事项

摘要:
2) 在链接阶段,如果通过-l选项指定动态库,则需要使用-l选项指定链接路径。这需要动态库使用lib前缀。如果从属动态库没有lib前缀,可以考虑指定动态库的路径并以从属文件的方式链接它。4) 请注意,-rpath指定的路径基于可执行文件的位置。编译链接完成后,可以通过ldd命令查看相关文件的动态库依赖关系。如果在rpath指定的路径中找不到依赖项,则依赖项将在ldd输出中显示为未找到。

    编译链接动态库时需要注意几个点:

    1)链接阶段要指定动态库的路径,与运行时要查找的动态库的路径是两个概念。

    2)链接阶段,如果是通过-l选项指定动态库时,需要搭配-L选项指定链接路径。这要求动态库使用lib前缀。

      如果依赖的动态库没有lib前缀,可以考虑指定动态库的路径,以依赖文件的方式链接。

      比如编译动态库c.so,当前路径为c.so的编译路径,依赖于../../test/a.so:

        gcc -shared -fPIC -o c.so c1.c c2.c ../../test/a.so -lrt -ldl -Wl, -rpath=./:../test

    3)运行时阶段,指定要动态装载的动态库的路径,则是通过-Wl,rpath选项来指定。如果是多个路径,则以冒号分隔。比如上述命令指定了当前路径和test路径。

    4)注意,-rpath所指定的路径,是以可执行文件所在的位置为参照的。而链接指定的路径,是以执行makefile所在的位置为参照的。如果链接指定的路径是错误的,在编译链接阶段就会报找不到依赖文件的错误。而如果rpath指定的路径中没有依赖的动态库,那么在运行时会报找不到依赖文件的错误。可以在编译链接结束后,通过ldd命令查看相关文件的动态库依赖,如果rpath指定的路径中找不到依赖的话,那么在ldd的输出中,依赖项会显示not found。除了ldd外,objdump、nm、readelf等都是分析依赖符号的有效手段。

免责声明:文章转载自《动态库链接注意事项》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[Jimmy原创] 在.NET环境下操作MySQL数据库昨晚的雪下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QT5 编译程序运行,报错丢失libgcc_s_sjlj1.dll。尝试重新安装该程序以解决此问题。

之前一直正常使用,最近在QT Creator中运行程序,直接程序异常结束,单独启动EXE程序时,报以上错误。 最后把问题锁定在libstdc++-6.dll库上,尝试把QT环境bin目录下的libstdc++-6.dll拿到程序运行目录下,临时解决此问题。 原因是最近安装过一个程序,这个程序在C:\Windows\System32下放了一个libstd...

qt调用仪器驱动库dll实现程控

在《使用qt+visa实现程控》中实现了qt调用visa库的简单Demo本文将尝试使用qt调用仪器驱动库来实现对仪器仪表的程控 开发环境 系统: windows 10 环境: qt 5.80 库: visa 16.0 + ivi 16.0 配置过程 驱动库为动态库,主要包含.h,.lib,.dll,则按照调用动态库方式进行尝试 1. 添加依赖项 在.p...

FFmpeg在Linux下编译使用

1.FFmpeg编译 1.1.安装yasm 这里我是直接通过ubuntu包安装的,当然也可以通过编译源码来安装。 sudo apt-get install yasm 1.2.下载FFmpeg git clone https://git.ffmpeg.org/ffmpeg.git 1.3.配置、编译FFMPEG ./configure --prefix=ho...

ffmpeg综合应用示例(三)——安卓手机摄像头编码

本文的示例将实现:读取安卓手机摄像头数据并使用H.264编码格式实时编码保存为flv文件。示例包含了 1、编译适用于安卓平台的ffmpeg库 2、在java中通过JNI使用ffmpeg 3、读取安卓摄像头数据并在后台线程中使用ffmpeg进行编码的基本流程 具有较强的综合性。 编译适用于安卓平台的ffmpeg库 平时我们编译ffmpeg类库都是在x86平...

linux 下 奇怪的 动态库 依赖问题

 转:http://fanwei51880.blog.163.com/blog/static/3240674020111145285375/   总结如下:1)当你在编译生成静态库的时候, 只需要相应的依赖库库的头文件即可. 只有在你想生成so,或可执行文件 时, 才需要lib库.   对于你没有用到的lib, 但是不包含又编译失败, 那么只包含其头文件即...

C/C++ GCC/Clang生成和链接静态库/动态库

{ //http://www.360doc.com/content/14/0413/16/15099545_368549362.shtml } GCC/Clang生成和链接静态库/动态库 { 1 2 3 4 5 //add.cpp intadd(inta, intb) { returna + b; } 1 2 3 4 5 6 7...