Ruby、ffi和自定义C库
我正在尝试创建一个自定义C库,我可以使用FFI从Ruby调用它。我的库将用我自己的代码包装某些libtiff函数,生成的高级函数将通过FFI接口从Ruby中调用 我已经用C编写了测试代码,它成功地编译成一个.so文件。我已经通过FFI将相同的代码插入Ruby,并且可以成功地从Ruby代码调用简单函数 然而,当我在我的C库代码中包含libtiff并定义一个使用一些libtiff例程的函数时,ruby代码在运行时抛出类似于以下的错误Ruby、ffi和自定义C库,c,ruby,linux,gcc,ffi,C,Ruby,Linux,Gcc,Ffi,我正在尝试创建一个自定义C库,我可以使用FFI从Ruby调用它。我的库将用我自己的代码包装某些libtiff函数,生成的高级函数将通过FFI接口从Ruby中调用 我已经用C编写了测试代码,它成功地编译成一个.so文件。我已经通过FFI将相同的代码插入Ruby,并且可以成功地从Ruby代码调用简单函数 然而,当我在我的C库代码中包含libtiff并定义一个使用一些libtiff例程的函数时,ruby代码在运行时抛出类似于以下的错误 /usr/bin/ruby: symbol lookup erro
/usr/bin/ruby: symbol lookup error: /<path_to_lib>/libtiffconverter.so: undefined symbol: TIFFOpen
更新2:
以下是ldd输出,现在一切正常:
bridge:~/tmp/tmp$ ldd libtiffconverter.so
linux-vdso.so.1 => (0x00007ffff4db7000)
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007fabcbea4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fabcbacb000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fabcb8a8000)
libjbig.so.0 => /usr/lib/x86_64-linux-gnu/libjbig.so.0 (0x00007fabcb69a000)
libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007fabcb441000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fabcb226000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fabcaf1d000)
/lib64/ld-linux-x86-64.so.2 (0x000056320a73f000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fabcad19000)
问题
/usr/bin/ruby:symbol查找错误://libtiffconverter.so:undefined symbol:TIFFOpen
找不到您的ConvertTIFF()
使用的函数TIFFOpen()
。此函数属于LibTIFF库。您需要将项目链接到此库
解决方案:链接到LibTIFF
将选项-ltiff
添加到上面的g++
行,即:
g++ -shared obj/Release/main.o -o bin/Release/libtiffconverter.so -s -ltiff
您可以检查您刚刚生成的LibTIFF转换器。因此实际上取决于LibTIFF库(它应该是这样的):
ldd libtiffconverter.so | grep libtiff
以下是上述命令的输出示例:
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007fda361a8000)
您可能还需要将-L
选项添加到上面的g++
行,后跟libtiff.so
所在的目录。要获取其位置,您可以执行以下操作:
find / -name 'libtiff*'
那没用。尝试了两种方法:“gcc-Wall-O2-fPIC-ltiff-I/usr/lib/x86_64-linux-gnu-I/usr/include/x86_64-linux-gnu-c//main.c-o obj/Release/main.o”和“gcc-Wall-O2-fPIC-L/usr/lib/x86_64-linux-gnu/libtiff.so-I/usr/lib/x86_64-linux-gnu-gnu-I/include/usr/include/x86_64-linux-gnu-c//main.c//main.c-o-obj/Release”,但很抱歉,编译错误相同,但这也不起作用。我尝试了两种方法,有libtiff和没有libtiff.so在目录的末尾:“gcc-Wall-O2-fPIC-ltiff-L/usr/lib/x86_64-linux-gnu/-I/usr/lib/x86_64-linux-gnu-I/usr/include/x86_64-linux-gnu-c/从同一命令行运行ruby脚本:echo$LIBRARY_PATH/usr/lib/x86_64-linux-gnu/。。。是的,它在路径中,但它是或不是似乎没有什么区别。@安德鲁,对不起,我实际上是说LD\u LIBRARY\u path
你上次的更新成功了-g++行上的ltiff完成了这个任务。我不需要-L选项。非常感谢你!我想我已经发现了问题:问题出在g++
行,而不是gcc
行。我已经更新了答案。
ldd libtiffconverter.so | grep libtiff
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007fda361a8000)
find / -name 'libtiff*'