[问题] 动态函式库存在,程式却找不到

楼主: Neisseria (Neisseria)   2016-10-24 19:01:04
开发平台(Platform): (Ex: Win10, Linux, ...)
Debian GNU/Linux Jessie
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
g++ 4.9.2
go 1.7.3
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
None
问题(Question):
我在练习将 Golang 转出的 shared library 和 C++ 程式结合
程式已经写好了,也转成 shared library (.so)
编译时也没跳错误讯息,编译指令如下:
$ g++ -o main main.cpp -L. -ldoubler
但是执行时,程式却说找不到 shared library,讯息如下:
libdoubler.so: cannot open shared object file: No such file or directory
蛮诡异的,那个 .so 档就在同一个资料夹中 Orz
我另外把这个程式包成 Ruby gem,给 Ruby 程式呼叫,可正确执行
我也在 Mac 上用同样的 main.cpp,也可正确执行
这个蛮难 google 的,因为会找到一大堆没装 xxx library 之类的讨论串 = =...
喂入的资料(Input):
None
预期的正确结果(Expected Output):
错误结果(Wrong Output):
./main: error while loading shared libraries:
libdoubler.so: cannot open shared object file: No such file or directory
程式码(Code):(请善用置底文网页, 记得排版)
# main.cpp
#include <iostream>
#include "libdoubler.h"
using std::cout;
using std::endl;
int main() {
cout << DoubleFloat(1.2) << endl;
}
如果大家有兴趣,可以到以下网址看我的程式码:
https://github.com/cwchentw/doubler
补充说明(Supplement):
PTT 惠我良多
作者: CoNsTaR ((const *))   2016-10-24 19:04:00
Linux 是不是要给相对/绝对路径,不像 Windows 只要在同目录下就可以
作者: descent (“雄辩是银,沉默是金”)   2016-10-24 19:05:00
export LD_LIBRARY_PATH=. 试试看
作者: Bencrie   2016-10-24 20:05:00
另外你可以用 ldd 查连结的状况LD_PRELOAD 这个变量你也可以玩玩看
作者: uranusjr (←這人是超級笨蛋)   2016-10-24 20:19:00
类 Unix 系统默认只会到特定的地方找动态数据库, 所以如果你不把 .so (或其他副档名) 放在那些地方, 就必须用环境变量来告诉作业系统额外的路径; . 代表“当前路径”LD_PRELOAD 则是用来告诉作业系统“不论如何, 在执行任何程式前都加载此函式库”; 这很容易造成问题, 请避免LD_LIBRARY_PATH 比较好一些, 但还是应该尽可能避免
作者: LiloHuang (十年一刻)   2016-10-24 21:45:00
LD_PRELOAD 可以用来做 API hooking 还满值得玩玩看
作者: LPH66 (-6.2598534e+18f)   2016-10-25 01:00:00
既然提了 LD_LIBRARY_PATH 那就顺便提 rpath在连结时加上 -rpath . 这个连结器参数就能让 loader 知道so 档也要在工作目录下找; 不过由于这是连结器 ld 的参数所以如果是经由 gcc/g++ 呼叫的话要用 -Wl 引导 (小写L)要写成 -Wl,-rpath,. 或写成 -Wl,-rpath -Wl,.-rpath 也能指定相对执行档的位置, 这时参数要使用 $ORIGIN这七个字表示执行档所在目录例如 -Wl,-rpath,'$ORIGIN/../lib'(因为这里必须要用 $ 字本身而非变量, 所以要用引号括起来)
作者: lovejomi (JOMI)   2016-10-25 15:23:00
export LD_LIBRARY_PATH= 请问一下这种方法一般程式user怎么可能会,换句话说他的用途感觉很狭隘不是?
作者: uranusjr (←這人是超級笨蛋)   2016-10-25 15:41:00
所以才有套件管理员啊, 自动帮你把东西装到读得到的地方像 PATH 环境变量的道理也是一样设环境变量和 rpath 都是 programmer 才需要知道的东西

Links booklink

Contact Us: admin [ a t ] ucptt.com