ruby 中使用 C++ .so 库的未解析符号

Posted

技术标签:

【中文标题】ruby 中使用 C++ .so 库的未解析符号【英文标题】:Unresolved symbols using C++ .so libraries inside ruby 【发布时间】:2013-05-07 14:27:27 【问题描述】:

我最近继承了 Ruby on Rails 项目的开发,专注于为两个提供一些高级图像分析功能的自定义库提供用户界面。

当我启动 webrick 服务器时,它似乎可以工作,但是当我尝试上传一些图像并且需要使用共享对象时,我得到:

> MagickppAPI::LoadImagesList
> Magick::readImages
ruby: symbol lookup error: /usr/local/lib/site_ruby/1.8/i486-linux/cargadorlib.so: undefined symbol: CloneImageInfo

我尝试在编译库时传递 --no-undefined ,所以它不允许未定义的符号,但它编译成功。此外,ldd 不会显示该库的任何未定义符号:

nobill@ubuntu-10:/usr/local/lib/site_ruby/1.8/i686-linux$ ldd cargadorlib.so 
linux-gate.so.1 =>  (0xb77ca000)
libruby1.8.so.1.8 => /usr/lib/libruby1.8.so.1.8 (0xb769a000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7681000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb767c000)
libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb764a000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7555000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb752f000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb73d0000)
/lib/ld-linux.so.2 (0xb77cb000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb73b0000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb73a7000)

我知道我的问题非常具体,所以我不一定期望得到一个神奇的答案;我会很高兴任何人发布有关问题所在的建议。

【问题讨论】:

【参考方案1】:

终于弄清楚发生了什么。 no--undefined 标志中的错字(实际上是 Wl,--no-undefined)使我无法意识到我缺少一些要链接的库:-lMagick++ -lMagickWand -lMagickCore

【讨论】:

以上是关于ruby 中使用 C++ .so 库的未解析符号的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:使用 SWIG 时 _...so 文件中的未定义符号

C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号

函数_main(OPENGL C++)中引用的未解析的外部符号_____________

在 iOS 中使用静态库的“架构 i386 的未定义符号”

Cython:共享对象中的未定义符号

动态加载库的未定义符号“typeinfo”