使用单声道可执行文件打包.dylib文件

问题描述:

我有一个应用程序,我想要捆绑一个特定的dylib。 我使用“dylibbundler”将dylib和依赖关系复制到可执行文件夹。以下是我正在使用的命令:使用单声道可执行文件打包.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种不同的参考图书馆的方式,但它始终没有找到它。

任何帮助将不胜感激,我几个月来一直在努力解决这个问题。

UPDATE: 如果我指定的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没有被取代,实际的绝对可执行路径。

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

尝试设置DYLD_LIBRARY_PATH,如其他答案中所述(注意,在执行应用程序之前必须对其进行设置,因为动态库加载程序在应用程序加载到内存中时读取此值,在执行Main方法之前执行) 。

+0

我也有一个想法,@executable_path指向单声道二进制。但是,下面的问题说,executable_path完全适用于单声道应用程序:http://*.com/questions/14536843/including-custom-dll-and-dylib-in-monomac-app有什么想法? –

+1

我依赖于你如何构建和执行你的应用程序。如果您使用的是MonoMac/Xamarin.Mac项目,那么该答案是正确的(因为构建过程将构建自定义启动器并将libmono链接到它,而不是使用单声道二进制本身),否则它不是。 –

因为我实际上是一个Linux的家伙,不知道考虑OSX动态库以及dylibbundler工具的确切结果是什么,我无法确切地告诉某些事情。然而,在Linux上,这些库在LD_LIBRARY_PATH变量的入口路径中搜索(等等)。 OSX相当于DYLD_LIBRARY_PATH。您可以尝试将此变量设置为包含库的目录。