免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5698 | 回复: 7
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 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
3 [报告]
发表于 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
4 [报告]
发表于 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
5 [报告]
发表于 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
6 [报告]
发表于 2016-05-18 23:04 |只看该作者
还有设置全局变量的方法来控制动态库载入,方法比较危险,不介绍了。

论坛徽章:
0
7 [报告]
发表于 2016-05-20 22:33 |只看该作者
gcc命令行的-L是指定 “链接” 时的查找路径的,

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

论坛徽章:
0
8 [报告]
发表于 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目录
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP