如何在Ubuntu终端运行Eclipse Neon编写的依赖共享库的C++程序
解决终端运行C++程序时共享库找不到的问题
嘿,这个问题我之前也碰到过!本质是终端环境和Eclipse的运行环境不一样——Eclipse在启动程序时,会自动把你依赖项目的库输出目录(比如各个子项目的Debug文件夹)加入到动态链接器的搜索路径里,但终端默认不会做这件事,所以系统找不到libfrmwrk.so这类依赖库。
给你几个靠谱的解决办法,按需选择:
方法1:临时配置(单次会话有效)
这是最快的临时方案,适合只是偶尔在终端运行的情况:
- 先确认你的三个依赖库
libfrmwrk.so、libEncoders.so、libNetworkLayer.so的位置,一般它们都在各自项目的Debug目录下,比如路径大概是:/builds/BaseCppProject/frmwrk/Debug//builds/BaseCppProject/Encoders/Debug//builds/BaseCppProject/NetworkLayer/Debug/
- 在终端里执行这条命令,把这些路径添加到动态链接器的搜索路径:
export LD_LIBRARY_PATH=/builds/BaseCppProject/frmwrk/Debug:/builds/BaseCppProject/Encoders/Debug:/builds/BaseCppProject/NetworkLayer/Debug:$LD_LIBRARY_PATH - 接着直接运行你的程序就行:
./Debug/BaseCppProjectRun
注意:这个设置只在当前终端窗口有效,关闭窗口后就失效了。
方法2:永久配置(全局生效)
如果需要每次打开终端都能直接运行程序,可以把库路径添加到系统的动态链接器配置里:
- 用编辑器新建一个配置文件(需要sudo权限):
sudo nano /etc/ld.so.conf.d/basecppproject.conf - 在文件里逐行写入三个依赖库的路径:
/builds/BaseCppProject/frmwrk/Debug /builds/BaseCppProject/Encoders/Debug /builds/BaseCppProject/NetworkLayer/Debug - 保存退出后,执行这条命令让系统更新链接器缓存:
sudo ldconfig
之后不管哪个终端会话,你都能直接运行./Debug/BaseCppProjectRun了。
方法3:嵌入路径到可执行文件(一劳永逸)
这个方法是把依赖库的路径直接编译进可执行文件里,这样程序不管在哪运行,都会自动去指定路径找库,完全不用依赖环境变量:
- 回到Eclipse,打开BaseCppProjectRun项目的属性窗口(右键项目 -> Properties)
- 依次展开C/C++ Build -> Settings -> GCC C++ Linker -> Miscellaneous
- 在Linker flags输入框里添加以下内容:
-Wl,-rpath=/builds/BaseCppProject/frmwrk/Debug:/builds/BaseCppProject/Encoders/Debug:/builds/BaseCppProject/NetworkLayer/Debug - 点击Apply and Close,然后重新编译整个项目
之后生成的BaseCppProjectRun可执行文件就自带了库路径信息,直接在终端运行再也不会报找不到库的错啦!
内容的提问来源于stack exchange,提问作者Yaron Israeli
相关产品推荐
相关产品推荐

