【发布时间】:2018-05-27 13:07:21
【问题描述】:
我正在尝试创建一个可以使用 FFI 从 Ruby 调用的自定义 C 库。我的库将使用我自己的代码包装某些 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
我的猜测是这与编译器/链接器的工作方式有关。我对 C 很生疏…… 15 年多没碰过它了,我不知道该怎么做才能解决这个问题。我正在使用 Code::Blocks IDE,并将我的代码放在动态库项目中。只要我不包含 libtiff,一切都会按预期工作。一旦我这样做......虽然代码编译,我得到 libtiff.so 中任何东西的符号查找错误。
这是我生成上述错误的测试库模块代码:
#include "tiffio.h"
int AddInt(int i1, int i2)
{
return i1 + i2;
}
void ConvertTIFF()
{
TIFF* tif = TIFFOpen("test0.tiff", "r");
if (tif) {
uint32 imagelength;
tdata_t buf;
uint32 row;
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
buf = _TIFFmalloc(TIFFScanlineSize(tif));
for (row = 0; row < imagelength; row++)
TIFFReadScanline(tif, buf, row, 0);
_TIFFfree(buf);
TIFFClose(tif);
}
}
这里是编译器命令
gcc -Wall -O2 -fPIC -I/usr/lib/x86_64-linux-gnu -I/usr/include/x86_64-linux-gnu -c /<path_to_source>/main.c -o obj/Release/main.o
g++ -shared obj/Release/main.o -o bin/Release/libtiffconverter.so -s
AddInt() 通过 FFI 从 ruby 调用,工作正常。 ConvertTIFF() 没有。任何帮助深表感谢。
更新 1:
这是我的自定义库的 ldd 输出:
bridge:~/tmp/tmp$ ldd libtiffconverter.so
linux-vdso.so.1 => (0x00007ffd20db8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4c9a84e000)
/lib64/ld-linux-x86-64.so.2 (0x000055a601577000)
更新 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)
【问题讨论】:
-
我想我找到了问题所在:问题出在
g++行,而不是gcc行。我已经更新了答案。