一、什么是-rpath
-rpath
是编译链接时使用的选项,指定动态链接库的搜索路径,让运行时能够找到需要的动态链接库。
在Unix/Linux系统中,一个可执行文件或者共享库,运行时需要依赖其他共享库,这些共享库都被安装到系统默认的目录中,如/lib
、/usr/lib
等。但是有时候,我们编写的程序需要链接自己的共享库,那么程序运行时找不到这些库,就需要通过-rpath
选项指定搜索路径。
gcc -o myprog myprog.c -L/mylib -lmylib
# 添加-rpath选项
gcc -o myprog myprog.c -L/mylib -lmylib -rpath=/mylib
二、-rpath的优先级
当运行时需要加载相同名称的共享库时,系统会按照一定的顺序搜索库的位置。这个顺序包括:
- 环境变量
LD_LIBRARY_PATH
指定的路径。 - 编译时指定的
-rpath
路径。 - 默认的标准路径,如
/lib
、/usr/lib
等系统目录。 优先级从高到低。
三、如何使用-rpath
1. 编写Makefile文件
在Makefile文件中,使用变量LDFLAGS
来指定-rpath
选项:
LDFLAGS = -Wl,-rpath=/usr/local/lib
# ...
$(CC) -o myprog $(OBJECTS) $(LDFLAGS) $(LIBS)
或者直接在命令行中指定:
gcc -o myprog myprog.c -L/usr/local/lib -lmylib -Wl,-rpath=/usr/local/lib
2. 使用chrpath命令
chrpath
是一个命令行工具,可以用来修改可执行文件或共享库的RPATH。使用方法如下:
chrpath -r /usr/local/lib myprogram
其中myprogram
表示可执行文件或共享库的名称,/usr/local/lib
是要设置的RPATH路径。
四、如何查看-rpath路径
可以通过如下命令查看动态链接库的依赖关系:
ldd myprog
也可以使用objdump
命令来查看可执行文件或共享库的RPATH和其他信息:
objdump -x myprog
五、-rpath的注意事项
- RPATH路径是相对路径还是绝对路径,会影响程序的定位。
- RPATH定义在可执行文件时,库的加载优先级较低,可能会受其他RPATH影响而加载错误的库。
- RPATH相对路径时,需要注意程序运行时的当前路径。
- 对于需要移植的程序,要注意跨平台的兼容性。
- 可以使用
patchelf
命令来修改可执行文件或共享库的RPATH,该命令在Linux系统中可用。
六、总结
-rpath
是用来指定动态链接库搜索路径的选项。通过Makefile、chrpath、objdump等方式来使用和查看-rpath路径。需要注意相对路径的使用、路径优先级的影响,以及跨平台的兼容性问题。