将共享对象库(.so)链接至Eclipse(Oxygen)运行报错求助
解决运行时找不到共享对象库(.so)的问题
这个问题其实很常见——编译通过说明链接阶段没问题,但运行时动态链接器找不到你的库,因为编译时的库路径配置和运行时动态链接器的搜索路径是两回事。下面给你几个靠谱的解决办法,按从临时到永久的顺序来:
1. 临时快速解决:设置LD_LIBRARY_PATH环境变量
动态链接器会优先从LD_LIBRARY_PATH环境变量指定的路径里找库。打开终端,先把你的库所在路径加到这个变量里:
export LD_LIBRARY_PATH=/绝对路径/到你的库所在目录:$LD_LIBRARY_PATH
比如你的库在/home/satinger/projects/libs里,就写:
export LD_LIBRARY_PATH=/home/satinger/projects/libs:$LD_LIBRARY_PATH
然后直接运行你的二进制文件就行。不过注意,这个设置只在当前终端会话有效,关闭终端后就失效了。
2. 用户级永久解决:把环境变量加到shell配置文件里
如果不想每次都手动输命令,可以把上面的export命令加到你的shell配置文件里:
- 如果你用bash,就编辑
~/.bashrc或者~/.bash_profile,把命令加在文件末尾 - 如果你用zsh,就编辑
~/.zshrc
保存后,运行下面的命令让配置生效:
source ~/.bashrc # 对应bash的情况
这样以后每次打开终端,这个环境变量都会自动生效。
3. 系统级永久解决:更新动态链接器的缓存
这个方法会让系统里所有用户都能找到这个库,适合公共库的场景:
- 打开
/etc/ld.so.conf文件(需要sudo权限),把你的库所在的绝对路径加进去,每行一个路径 - 或者更规范的做法:在
/etc/ld.so.conf.d/目录下新建一个后缀为.conf的文件(比如satinger_libs.conf),然后把库路径写在这个文件里 - 最后运行下面的命令更新动态链接器的缓存:
sudo ldconfig
这样动态链接器就会永久记住这个路径了。
4. 编译时嵌入库路径(最省心的方式)
还有一种一劳永逸的办法:在编译程序的时候,直接把库的路径嵌入到二进制文件里,这样运行时不需要任何环境变量配置。
在Eclipse里的操作步骤:
- 打开
Project -> Properties -> C/C++ Build -> Settings -> Cross G++ Linker -> Miscellaneous - 在
Linker flags里添加参数:-Wl,-rpath=/绝对路径/到你的库所在目录 - 比如你的库在
/home/satinger/projects/libs,就加-Wl,-rpath=/home/satinger/projects/libs
重新编译项目后,生成的二进制文件会自动去指定路径找库,再也不用操心环境变量的问题了。
额外检查点
如果试了上面的方法还是不行,建议排查这几点:
- 确认你的
.so文件确实在你指定的路径里,没有打错路径 - 检查库文件的权限:至少要有读权限,用
ls -l libsharedObjectLibrary.so看权限位,确保其他用户(如果不是用root运行的话)能读 - 检查架构匹配:用
file命令看库和程序的架构是不是一致,比如:
两者的输出应该都是file libsharedObjectLibrary.so file 你的二进制文件名x86-64(64位)或者i386(32位),如果一个是32位一个是64位,肯定会找不到。
内容的提问来源于stack exchange,提问作者Satinger
相关产品推荐
相关产品推荐

