我在弗里诺德的西弗海峡问过这个问题,西弗蒙特建议掉头
turning on verbose mode
ERROR: Failed to load plugin /usr/lib/x86_64-linux-gnu/ao/plugins-4/libalsa.so => dlopen() failed
dlopen
有些东西,但它失败了。它没有显示更多的细节,所以我在GDB下运行了这个程序,并在上设置了一个断点
打开
的断点
libalsa
和跑步
finish
,我试图用
print (const char *)dlerror()
. 通过这个,我得到了一个更详细的错误:
/usr/lib/x86_64-linux-gnu/ao/plugins-4/libalsa.so: undefined symbol: ao_is_big_endian
打开
下列值中的0或更多值也可以是“或”
旗帜
:
全球RTLD
:此共享对象定义的符号将可用于后续加载的共享对象的符号解析。
本地RTLD
:这是相反的
全球RTLD
因为我的
仅使用呼叫
RTLD_LAZY
RTLD_GLOBAL
或
RTLD_LOCAL
,默认为
,它不公开共享对象中的符号(如
ao_is_big_endian
)到随后加载的共享对象(如
libalsa.so
).
void *handle = dlopen("./libplayao.so", RTLD_LAZY);
收件人:
void *handle = dlopen("./libplayao.so", RTLD_LAZY | RTLD_GLOBAL);
你瞧,它起作用了!