Bundling .dylib files with mono executable

自作多情 提交于 2019-12-01 12:20:19

问题


I have an application and I'd like to bundle a specific dylib along with it. I'm using "dylibbundler" to copy the dylib along with dependencies to the executable folder. Here's the command I'm using:

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

dylibbundler is located in the same directory with the executable. The tool recursively runs "install_name_tool" on the library and all of its dependencies (and copies them to a specified directory). Running otool -L on the ./libs/libil.1.dylib returns:

@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)

It seems to me that it has copied everything over correctly. But when I run my application, I keep getting the same exception:

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

As you can see, I've tried 3 different ways of referencing to the library, but it always fails to find it.

Any help would be greatly appreciated, I've been trying to solve this issue for months now.

UPDATE: If I specify an absolute path to the dylib, it finds it, but then complains about the dependencies:

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'.

It seems to me that @executable_path isn't being substituted with the actual absolute executable path.


回答1:


Have in mind that the native executable is not myapp.exe, it's the mono binary.

Try setting DYLD_LIBRARY_PATH as mentioned in a different answer (note that you have to set it before executing your app, since the dynamic library loader reads this value when the application is loaded into memory, way before your Main method is executed).




回答2:


Since I am actually a Linux guy and don't know what are the exact results considering OSX dynamic libraries as well as the dylibbundler tool, I can't really tell something for sure. On Linux, however, the libraries are searched (among others) in paths enlisted in the LD_LIBRARY_PATH variable. The OSX equivalent is DYLD_LIBRARY_PATH. You can try setting this variable to the directory containing the library.



来源:https://stackoverflow.com/questions/19522244/bundling-dylib-files-with-mono-executable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!