在路径/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)。