chen1922 发表于 2016-05-11 11:53

gcc链接时 -L目录和系统目录顺序关系

系统是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名字的就算了...




sxhlinux 发表于 2016-05-15 21:13

执行gcc命令时,添加 -v 选项,将连接过程打印出来,就会发现连接顺序是由gcc的内置变量LIBRARY_PATH决定的。下面是我电脑上执行编译链接过程中打印出来的,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的软连接。

买单老 发表于 2016-05-17 00:19

/usr/lib/x86_64-linux-gnu/这个目录我这的机器是默认的链接目录,和你的好像不一样哎

爻易 发表于 2016-05-18 22:56

一种是文件系统的方法:移动共享库文件到接受位置,或在接受位置创建个符号链接

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

爻易 发表于 2016-05-18 23:02

共享库路径又有两种指定含义:一种是链接器链接可执行文件时库搜索路径,一种是可执行文件执行时库搜索路径

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

爻易 发表于 2016-05-18 23:04

还有设置全局变量的方法来控制动态库载入,方法比较危险,不介绍了。

drangon 发表于 2016-05-20 22:33

gcc命令行的-L是指定 “链接” 时的查找路径的,

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

chen1922 发表于 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目录
页: [1]
查看完整版本: gcc链接时 -L目录和系统目录顺序关系