运行时找不到.so文件

在路径/home/mike/testlib/下有一个mylib.c文件和mylib.h文件,用如下命名制作为共享库(.so文件):

g++ -c mylib.c -fPIC -o mylib.o

g++ mylib.o -shared -o mylib.so

编译通过。


在路径/home/mike/test/下有一个test.c文件要使用mylib.so,先将mylib.so文件拷贝到/home/mike/test/下,然后使用如下命令:

g++ -g -c test.c -I /home/mike/testlib/ -o test.o

g++ test.o -lmylib -L. -o test 、

编译通过。但运行时报错找不到库文件,错误信息如下:

./test: error while loading shared libraries: libmystack.so: cannot open shared object file: No such file or directory

用命令ldd test查看test用到的共享库,发现libmylib.so => not found。

为了解决上面的问题,我们可以将.so文件放入默认搜索路径/lib中。但有时,特别是多用户环境下,我们不享有在默认搜索路径写入的权限。

一个解决方案是设置LD_LIBRARY_PATH环境变量。比如:

$export LD_LIBRARY_PATH=.

这样,可执行文件执行时,操作系统将在先在LD_LIBRARY_PATH下搜索库文件,再到默认路径中搜索。环境变量的坏处是,它会影响所有的可执行程序。如果我们在编译其他程序时,如果我们不小心,很可能导致其他可执行文件无法运行。因此,LD_LIBRARY_PATH环境变量多用于测试。

另一个解决方案,即提供-rpath选项,将搜索路径信息写入test文件(rpath代表runtime path)。这样就不需要设置环境变量。这样做的坏处是,如果库文件移动位置,我们需要重新编译test。使用如下命令编译test.c:

g++ -g -c test.c -I /home/mike/testlib/ -o test.o

$g++ test.o -lmylib -L. -Wl,-rpath=. -o test

-Wl表示,-rpath选项是传递给连接器(linker)。


你可能感兴趣的:(.so)