【背景】
在linux上做RISC-V的交叉编译,使用的交叉编译工具链:riscv64-linux-gnu
但是make完成后,得到的可执行文件无法运行,提示缺乏库文件。
但是我的lib路径下是存在libstdc++.so.6这个文件的。
【BUG描述】
lib/cpp_deploy_pack: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
【解决】
尝试1(失败):下载32位库文件
直接搜索,大部分网上的答案都会让你下载32位或者其它版本的libstdc++.so.6库,但是并没有起到作用。
尝试2(成功):
报错原因:
- make的时候:使用了交叉编译工具riscv64-linux-gnu,则我们的.cpp文件链接的标准库是riscv64-linux-gnu提供的libstdc++.so.6,而不是系统默认的标准库;
- 运行的时候:可执行文件默认链接到系统的libstdc++.so.6,因此出现错误。
方法1:
要让可执行文件能搜索到交叉编译器提供的libc++.so.6,
可以直接把交叉编译器的libc++.so放到系统的lib文件夹下面,就可以自动检测:
sudo cp /usr/riscv64-linux-gnu/lib/* /lib/
这是从网上看到的策略,这样做会覆盖系统的文件,个人不太推荐这样做。
方法2:
- 在当前终端指定交叉编译器的libstdc++.so路径,这样动态链接时可以被检测到:
(仅当前终端有效)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/riscv64-linux-gnu/lib
- 也可以在bash里面一劳永逸地更改:
gedit ~/.bashrc
在文件最后一行添加:(xxx 为动态库文件的绝对存储路径)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx
然后重启终端:
source ~/.bashrc