【问题标题】:Bundling .dylib files with mono executable将 .dylib 文件与单声道可执行文件捆绑在一起
【发布时间】:2013-10-31 13:57:32
【问题描述】:

我有一个应用程序,我想将一个特定的 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 并没有被实际的绝对可执行路径替换。

【问题讨论】:

    标签: mono dylib dllnotfoundexception


    【解决方案1】:

    由于我实际上是一个 Linux 人,并且不知道考虑到 OSX 动态库以及 dylibbundler 工具的确切结果是什么,所以我无法确定。然而,在 Linux 上,在 LD_LIBRARY_PATH 变量中登记的路径中搜索(以及其他)库。 OSX 等价物是DYLD_LIBRARY_PATH。您可以尝试将此变量设置为包含库的目录。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我还认为@executable_path 指向单声道二进制文件。然而,以下问题表明 executable_path 与单声道应用程序完美配合:stackoverflow.com/questions/14536843/… 有什么想法吗?
      • 我取决于您如何构建和执行您的应用程序。如果您使用的是 MonoMac/Xamarin.Mac 项目,那么该答案是正确的(因为构建过程将构建自定义启动器并将 libmono 链接到其中,而不是使用单声道二进制文件本身),否则不是。
      猜你喜欢
      • 1970-01-01
      • 2016-08-04
      • 2012-05-24
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      相关资源
      最近更新 更多