免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4849 | 回复: 7

[其他] gcc链接时 -L目录和系统目录顺序关系 [复制链接]

论坛徽章:
0
发表于 2016-05-11 11:53 |显示全部楼层
系统是ubuntu14.04
apt-get install 安装了mysql5.6, 安装好后自带 /usr/lib/x86_64-linux-gnu/libmysqlclient.so
我自己从mysql官网上下载了mysql-connector-c-6.1.6-src
编译安装 ldconfig后存在以下文件
/usr/local/mysql/lib/libmysqlclient.so

编译main.cpp
gcc main.cpp -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient

ldd ./a.out
libmysqlclient.so.18 => /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18 (0x00007fb0bb7ba000)
显示链接到了系统自带了/usr/lib/目录下了,没有链接到/usr/local/mysql/目录
请问下怎么才能链接到/usr/local/mysql/下
说改/usr/lib/x86_64-linux-gnu/libmysqlclient.so名字的就算了...




论坛徽章:
0
发表于 2016-05-15 21:13 |显示全部楼层
执行gcc命令时,添加 -v 选项,将连接过程打印出来,就会发现连接顺序是由gcc的内置变量LIBRARY_PATH决定的。下面是我电脑上执行编译链接过程中打印出来的,
  1. LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/  
复制代码
由此可以见如果想使用/usr/local/mysql/目录下的动态库,可以在/lib 目录下创建一个到/usr/local/mysql/lib/libmysqlclient.so的软连接。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-02-12 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2016-05-17 00:19 |显示全部楼层
/usr/lib/x86_64-linux-gnu/  这个目录我这的机器是默认的链接目录,和你的好像不一样哎

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2016-05-18 22:56 |显示全部楼层
一种是文件系统的方法:移动共享库文件到接受位置,或在接受位置创建个符号链接

另一种是链接工具的方法:在链接可执行文件时指定共享库路径

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2016-05-18 23:02 |显示全部楼层
共享库路径又有两种指定含义:一种是链接器链接可执行文件时库搜索路径,一种是可执行文件执行时库搜索路径

请查阅所用链接器文档确定各自的指定选项

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2016-05-18 23:04 |显示全部楼层
还有设置全局变量的方法来控制动态库载入,方法比较危险,不介绍了。

论坛徽章:
0
发表于 2016-05-20 22:33 |显示全部楼层
gcc命令行的-L是指定 “链接” 时的查找路径的,

而程序运行时的dll的查找路径,要么设置 LD_LIBRARY_PATH 环境变量,要么链接的时候加一下 -Wl,rpath,/xxx/path/ 命令行参数来指定查找路径

论坛徽章:
0
发表于 2016-05-26 17:36 |显示全部楼层
总算搞明白了
-Ldir
    Add directory dir to the list of directories to be searched for -l.
下面是ld的选项
  -rpath PATH                 Set runtime shared library search path
  -rpath-link PATH            Set link time shared library search path
要确切指定运行时加载某个.so就需要加-Wl,-rpath=xxx
如果没有指定-Wl,-rpath那么 gcc默认查找LD_LIBRARY_PATH目录
总结:如果想要避免动态库升级带来的bug,还是需要在编译时指定-Wl,-rpath目录
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP