动态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的自带变量,属于用户自定义变量。

你可能感兴趣的:(Linux)