linux c++ 加载动态库常用的三种方法
链接库时的搜索路径顺序:LD_LIBRARY_PATH --> /etc/ld.so.conf --> /lib,/usr/lib
方法1. vi .bash_profile
设置环境变量LD_LIBRARY_PATH并导出
另:
LD_LIBRARY_PATH:启动时连接共享函数库,执行时打开动态函数库首先搜索的路径。
LD_DEBUG:显示运行时的信息,如符号寻找和绑定,重定向,执行等等。
方法2. a)直接在/etc/ld.so.conf 里添加库路径
b)新建文件,后缀为.conf,添加库路径信息,然后保存放到/etc/ld.so.conf.d/下
最后执行ldconfig命令,重建/etc/ld.so.cache
另:
ldconfig -n 路径名:为指定路径下的函数库创建soname库,但不放入ld.so.cache文件。
/etc/ld.so.conf:存放ldconfig运行时搜索的路径。
/etc/ld.so.cache:存放ldconfig搜索到的库和soname。
ld-linux.so:载入ELF文件用。可执行文件启动,启动时载入共享函数库都要用到这个库。
libc.so:c语言支持库。
libdl.so:动态连接库用。
方法3. 使用rpath将库路径硬编码到可执行文件内部
搜索路径分两种,一种是链接时候的搜索路径,一种是运行时期的搜索路径。
单个路径: -Wl,rpath /opt -L/opt -lddd // 嵌入路径的同时,将库目录指定,使得链接时后面的libddd.so能被找到。
多个路径: -Wl,rpath,/opt:../lib -L/opt -L../lib -lddd //使用-Wl时,后面的参数之间不要有空格!!!
查看生成文件的信息: readelf -d demo(生成的文件)
9. Dynamic section at offset 0xc58 contains 26 entries:
10. Tag Type Name/Value
11. 0x0000000000000001 (NEEDED) Shared library: [libtmp.so]
12. 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
13. 0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
14. 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
15. 0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
16. 0x000000000000000f (RPATH) Library rpath: [/tmp/]
17. 0x000000000000001d (RUNPATH) Library runpath: [/tmp/]
例子:
CC = g++
WORK_DIR =
SRC_DIR = .
OBJ_DIR = ../obj
INC_DIR = ../include
LIB_DIR = ../lib
BIN_DIR = ../bin
CFLAGS = -g -O -Wall -Wuninitialized
CFLAGS += -I$(INC_DIR) -I$(INC_DIR)/test
LDFLAGS += -Wl,-rpath,$(LIB_DIR)/test:$(LIB_DIR)/test2
...
...
...
参考:
http://blog.chinaunix.net/uid-27105712-id-3313327.html
http://www.myexception.cn/other/681660.html
http://blog.csdn.net/defeattroy/article/details/6700616
http://blog.csdn.net/russule/article/details/7057398
http://blog.csdn.net/dbzhang800/article/details/6918413