如何正确链接GSL库?运行程序提示找不到libgsl.so.27
问题现象
安装GSL 2.7.1版本过程中,使用如下命令完成编译:
gcc -Wall -I/opt/gsl/include -c main.c gcc -L/opt/gsl/lib main.o -lgsl -lgslcblas -lm -o main chmod +x ./main
运行编译出的二进制文件时报错退出,错误信息如下:
./main: error while loading shared libraries: libgsl.so.27: cannot open shared object file: No such file or directory
非root用户执行ls -al /opt/gsl/lib确认库目录下文件权限、软链接均正常,输出如下:
drwxr-xr-x 3 root root 4096 Jul 6 12:05 . drwxr-xr-x 6 root root 4096 Jul 6 12:05 .. -rw-r--r-- 1 root root 26382732 Jul 6 12:05 libgsl.a -rw-r--r-- 1 root root 2345554 Jul 6 12:05 libgslcblas.a -rwxr-xr-x 1 root root 946 Jul 6 12:05 libgslcblas.la lrwxrwxrwx 1 root root 20 Jul 6 12:05 libgslcblas.so -> libgslcblas.so.0.0.0 lrwxrwxrwx 1 root root 20 Jul 6 12:05 libgslcblas.so.0 -> libgslcblas.so.0.0.0 -rwxr-xr-x 1 root root 1429728 Jul 6 12:05 libgslcblas.so.0.0.0 -rwxr-xr-x 1 root root 915 Jul 6 12:05 libgsl.la lrwxrwxrwx 1 root root 16 Jul 6 12:05 libgsl.so -> libgsl.so.27.0.0 lrwxrwxrwx 1 root root 16 Jul 6 12:05 libgsl.so.27 -> libgsl.so.27.0.0 -rwxr-xr-x 1 root root 15920320 Jul 6 12:05 libgsl.so.27.0.0 drwxr-xr-x 2 root root 4096 Jul 6 12:05 pkgconfig
故障原因
编译命令里的-L/opt/gsl/lib仅对编译阶段的链接器生效,用来指定编译时查找库文件的路径。程序启动时,系统动态链接器默认只会扫描预设的系统库路径(比如/lib、/usr/lib),不会主动读取/opt/gsl/lib这种自定义安装路径,因此找不到依赖的共享库,和文件权限、软链接配置无关。
解决方案
根据自身权限和使用场景选择对应方案即可:
- 临时单次运行:执行程序前先注入动态库搜索路径,仅当前终端会话生效
export LD_LIBRARY_PATH=/opt/gsl/lib:$LD_LIBRARY_PATH ./main - 非root用户个人使用永久生效:把上述
export命令追加到自己家目录的shell配置文件末尾,使用Bash就追加到~/.bashrc,使用Zsh就追加到~/.zshrc,追加完成后执行source ~/.bashrc(替换为自己使用的配置文件路径)重载配置,后续新开终端可直接运行程序,无需重复设置环境变量。 - 免配置单二进制生效:不想修改shell配置的话,可在链接阶段加rpath参数,把库搜索路径直接写入二进制文件,后续运行无需任何额外配置,修改后的链接命令如下:
gcc -L/opt/gsl/lib main.o -lgsl -lgslcblas -lm -Wl,-rpath=/opt/gsl/lib -o main - 有root权限全局生效:将GSL库路径加入系统动态链接配置,执行完成后所有用户均可直接运行依赖GSL的程序:
echo "/opt/gsl/lib" | sudo tee /etc/ld.so.conf.d/gsl.conf sudo ldconfig
内容的提问来源于stack exchange,提问作者infinitezero
相关产品推荐
相关产品推荐

