标签:Xlinker obj scanner rpath Wl 编译 动态 链接
gcc编译链接动态库.so的两个链接过程
在 linux下gcc编译链接动态库有两个链接过程:
- 编译时链接
- 运行时链接
编译时链接:系统会优先从-L指定的路径查找库文件,若没有则从/lib/下查找,所以如果/lib/下面有所需静态库文件则-L可省略,链接之后的文件会记住动态库里面相应的函数地址
运行时链接:系统会直接在/lib/下查找所需动态库文件,若没有则运行报错,找到后将相应函数定义链接进来然后执行
所以实际上用-L指定动态库文件路径只能保证编译通过,是否能执行还是得看/lib/下面有没有该库文件
如何指定运行时动态库.so的链接地址?
若采用隐式链接编译可执行程序时,需要在编译时为可执行程序指定运行时动态库搜索地址,即利用rpath选项来告诉链接器在程序执行时到哪里去找它依赖的动态库。例子如下:-Wl,-rpath,<path/to/lib>
或-Wl,rpath = <path/to/lib>
sc:
gcc -O2 -mcmodel=large -c $(CFLAGS) -I./include ./libsc.cpp -Os -D_FX_OS_=_FX_LINUX_DESKTOP_
@-mkdir -p ./scanner/obj
@mv *.o ./scanner/obj
@-mkdir -p ./scanner/obj
gcc -O2 -mcmodel=large -fPIC -shared -o ./libsc.so ./scanner/obj/*.o -L./scanner/winmage -Xlinker "-(" -Wl,-rpath=./scanner/winmage -lwinmage -Xlinker "-)" -lz -ldl
rm -rf ./scanner/obj
gcc -Wall demosc.c -ldl -o demosc
./demosc
参考:
关于linux下链接动态库.so文件时时因编译时链接跟运行时链接而出错的一些问题,以及-L -l的意义
指定运行时动态库搜索位置:-rpath链接指令的正确用法(相对路径or绝对路径)
标签:Xlinker,obj,scanner,rpath,Wl,编译,动态,链接 来源: https://blog.csdn.net/qq_33177268/article/details/121060410
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。