SWIG、perl、DynaLoader 在 OS X 上找不到 boot_$Module

SWIG, perl, DynaLoader can't find boot_$Module on OS X

我正在尝试在 OS X 10.10.2 上构建和安装 SWIG 生成的 perl API。 (它用于 FreeLing 3.1 语言分析工具包。)我已经生成并编译了 SWIG 文件,生成 freeling.so.

但是当我尝试在 perl 脚本中 use freeling 时,出现错误:

Can't find 'boot_freeling' symbol in /usr/local/lib/libfreeling.dylib at freeling.pm line 11.

但是 boot_freeling 应该在 SWIG 生成的 freeling.so 中定义,而不是在 libfreeling.dylib(FreeLing 包库)中定义。 (nm -U 证实了这一点:_boot_freeling 在 freeling.so 中定义;我假设前导下划线只是目标文件格式的一部分。)

我已经确保 freeling.so 在 LD_LIBRARY_PATH 中出现在 libfreeling.dylib 之前。我也试过将 freeling.so 的路径移到 @DynaLoader::dl_library_path 上。

我怀疑这不是路径问题,而是关于为 OS X 构建的问题。过去,我在 Ubuntu 上构建它并且工作正常。我调整了 gcc 选项(-bundle 而不是 -shared)。


附加信息:

perl -V:dlext => dlext='bundle';

建筑 SOso-0.01.patch.txt 产生:

blib
├── blib/arch
│   └── blib/arch/auto
│       └── blib/arch/auto/SOso
│           └── blib/arch/auto/SOso/SOso.bundle
├── blib/bin
├── blib/lib
│   ├── blib/lib/SOso.pm
│   └── blib/lib/auto
│       └── blib/lib/auto/SOso
├── blib/man1
├── blib/man3
└── blib/script

Makefile 目标:

freeling.bundle: freeling_perlAPI.cxx
    g++ -v -bundle -o freeling.bundle freeling_perlAPI.cxx -lfreeling -lperl -lboost_system -I $(FREELINGDIR)/include -I $(BOOSTDIR)/include -I $(ICU4CDIR)/include -L $(FREELINGDIR)/libfreeling -I $(PERLDIR)/CORE -L $(LIBDIR) -L $(BOOSTDIR)/lib -L $(PERLDIR)/CORE -fPIC

好的,促进回答:)

perl -V:dlext 你能得到什么? 当你编译这个模块时 SOso-0.01.patch.txt 在 blib 中创建了哪些文件?

嗯 :) 如果您的 os/perl 配置为查找 freeling.bundle,我认为它不会尝试查看 freeling.so .... 所以我会尝试做一些事情......重命名文件以使用 dlext