动态so库的链接:运行时链接和编译时链接 | 您所在的位置:网站首页 › 动态库链接方式 › 动态so库的链接:运行时链接和编译时链接 |
在编写Makefile时,如果一个程序需要链接so库,则需要通过两个步骤来完成,分为运行时动态库的链接和编译时动态库的链接,缺一不可。
1、运行时动态库的链接 在执行可执行文件时,提示: error while loading shared libraries: libprint.so: cannot open shared object file: No such file or directory 解决:有三种方法 1)将 libprint.so放入系统库或用户库目录下: sudo cp libprint.so /usr/local/lib sudo ldconfig 2)在makefile中添加: -Wl,-rpath LDFLAGS = -lm -lprint -L$(TOP_PATH)/lib -Wl,-rpath=$(TOP_PATH)/lib说明: gcc编译链接动态库时,很有可能编译通过但是执行时,找不到动态链接库,那是因为-L选项指定的路径只在编译时有效,编译出来的可执行文件不知道-L选项后面的值,当然找不到。 解决方法是通过-Wl,rpath=,使得execute记住链接库的位置 3)使用LD_LIBRARY_PATH推荐使用方法一。 2、编译时链接 LDFLAGS链接器参数,如指定库位置: LDFLAGS=-L/usr/lib -L/path/to/your/lib LIBS告诉链接器要链接哪些库文件,如: LIBS = -lpthread -liconv 最正规的做法: LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -lmysqlclient -liconv因为LIBS不是makefile的自带变量,属于用户自定义变量。 |
CopyRight 2018-2019 实验室设备网 版权所有 |