使用单声道可执行文件捆绑.dylib文件

时间:2013-10-22 15:34:08

标签: mono dylib dllnotfoundexception

我有一个应用程序,我想将特定的dylib与它捆绑在一起。 我正在使用“dylibbundler”将dylib和依赖项复制到可执行文件夹。这是我正在使用的命令:

dylibbundler -od -b -x /opt/local/lib/libil.dylib -d ./libs/ -p @executable_path/libs/

dylibbundler与可执行文件位于同一目录中。该工具以递归方式在库及其所有依赖项上运行“install_name_tool”(并将它们复制到指定的目录)。在./libs/libil.1.dylib上运行otool -L会返回:

@executable_path/libs/libIL.1.dylib (compatibility version 3.0.0, current version 3.0.0)
@executable_path/libs/libtiff.5.dylib (compatibility version 8.0.0, current version 8.0.0)
@executable_path/libs/liblzma.5.dylib (compatibility version 6.0.0, current version 6.4.0)
@executable_path/libs/libpng15.15.dylib (compatibility version 30.0.0, current version 30.0.0)
@executable_path/libs/libmng.1.dylib (compatibility version 2.0.0, current version 2.0.0)
@executable_path/libs/liblcms.1.dylib (compatibility version 2.0.0, current version 2.19.0)
@executable_path/libs/libjasper.1.dylib (compatibility version 2.0.0, current version 2.0.0)
@executable_path/libs/libjpeg.9.dylib (compatibility version 10.0.0, current version 10.0.0)
@executable_path/libs/libIlmImf.6.dylib (compatibility version 7.0.0, current version 7.0.0)
@executable_path/libs/libImath.6.dylib (compatibility version 7.0.0, current version 7.0.0)
@executable_path/libs/libHalf.6.dylib (compatibility version 7.0.0, current version 7.0.0)
@executable_path/libs/libIlmThread.6.dylib (compatibility version 7.0.0, current version 7.0.0)
@executable_path/libs/libIex.6.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
@executable_path/libs/libz.1.dylib (compatibility version 1.0.0, current version 1.2.7)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)

在我看来,它已经正确地复制了一切。但是当我运行我的应用程序时,我一直得到同样的例外:

Unhandled Exception: System.DllNotFoundException: ./libs/libIL.1.dylib
Unhandled Exception: System.DllNotFoundException: @executable_path/libs/libIL.1.dylib
Unhandled Exception: System.DllNotFoundException: libs/libIL.1.dylib

正如您所看到的,我尝试了3种不同的引用库的方法,但总是找不到它。

非常感谢任何帮助,我一直试图解决这个问题好几个月。

更新 如果我指定dylib的绝对路径,它会找到它,但随后会抱怨依赖项:

Mono: DllImport error loading library 'dlopen(/Users/me/myapp/libs/libil.1.dylib, 9): Library not loaded: @executable_path/libs/libtiff.5.dylib
  Referenced from: /Users/me/myapp/libs/libil.1.dylib
  Reason: image not found'.

在我看来,@ executable_path没有被实际的绝对可执行路径替换。

2 个答案:

答案 0 :(得分:2)

请记住,本机可执行文件不是myapp.exe,而是单声道二进制文件。

尝试按照不同的答案设置DYLD_LIBRARY_PATH(请注意,您必须在执行应用程序之前设置它,因为动态库加载器在应用程序加载到内存时读取此值,在执行Main方法之前)。

答案 1 :(得分:1)

由于我实际上是一个Linux人,并且不知道考虑到OSX动态库以及dylibbundler工具的确切结果是什么,我无法确切地说出一些事情。但是,在Linux上,在LD_LIBRARY_PATH变量中列出的路径中搜索(以及其他)库。 OSX等效项为DYLD_LIBRARY_PATH。您可以尝试将此变量设置为包含库的目录。