Ruby、ffi和自定义C库

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

我正在尝试创建一个自定义C库,我可以使用FFI从Ruby调用它。我的库将用我自己的代码包装某些libtiff函数,生成的高级函数将通过FFI接口从Ruby中调用

我已经用C编写了测试代码,它成功地编译成一个.so文件。我已经通过FFI将相同的代码插入Ruby,并且可以成功地从Ruby代码调用简单函数

然而,当我在我的C库代码中包含libtiff并定义一个使用一些libtiff例程的函数时,ruby代码在运行时抛出类似于以下的错误

/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*'