macos – 在Mac上包含带静态链接(mkbundle)Mono Exe的GTK#Dll

我有一个用c#编写的应用程序使用Mono Framework和GTK#用于UI.Im尝试为MacOSX创建一个静态包(包括gtk#和mono运行时)

我只是使用我的exe文件捆绑了Mono

mkbundle --static hello.exe -o --deps hello2.exe

我得到了exe文件但是当我拖动它并把它放在终端上时我得到System.DllNotFound异常:glibsharpglue-2

我知道我需要包含gtk#libraries.But我不知道如何使用静态链接单声道运行时.有一个选项,使用mkbundle.All,我需要得到的是一个准备运行的最终独立包在Mac上.

请帮帮我.

更新:
我正在使用Platypus制作.app包的shell脚本

export DYLD_FALLBACK_LIBRARY_PATH="/Library/Frameworks/Mono.framework/Versions/Current/lib:$DYLD_FALLBACK_LIBRARY_PATH:/usr/lib"    
exec /Library/Frameworks/Mono.framework/Versions/Current/bin/mono myapp.exe

我目前正在使用platypus中提供的选项来包含myapp.exe文件.我如何包含GTK所需的dll?请帮帮我.

最佳答案 错误来自于没有找到GTK共享对象库(SO / dylib).

使用mkbundle:

如果使用32位Mono,则需要为AS和CC分配拱门类型.默认情况下,clang将编译并链接x86_64,这可能与您安装的Mono的arch类型不匹配.

export AS="as -arch i386"
export CC="cc -arch i386 -framework CoreFoundation -lobjc -liconv"

mkbundle gtkdesigner.exe --deps -o gtkdemo

生成的可执行文件仍然需要安装Mono(以及任何相关的共享对象/ dylib).

或者添加–static以静态链接到单声道lib并因此调用Mono的LGPL(您将需要分发您的原始CIL图像,以便用户可以升级运行您的应用程序的Mono版本,除非您拥有Xamarin的许可证)

mkbundle --static gtkdesigner.exe --deps -o gtkdemo

生成的可执行文件不需要安装Mono,但仍然需要任何相关的共享对象/ dylib.

基于GTK / GTK#的应用程序:

基于GTK#的应用程序仍然需要安装GTK共享对象/ dylib并由生成的可执行文件访问(在本例中为gtkdemo):

因此,如果您尝试运行./gtkdemo,则需要查找共享库,例如libc.dylib,libgtksharpglue-2.so等等,否则将显示您获得的错误.

将dylib库路径设置为GTK库,而不是C#CIL绑定库(GTK#),而是本机共享库.由于您在OS-X上安装了Mono,因此它还安装了自己的GTK版本,可以在/Library/Frameworks/Mono.framework/Versions/Current/lib中找到.如果要将自己的GTK版本安装到其他位置,只需更改指向该位置的路径即可.您还将包括OS的std C库的位置.

export DYLD_FALLBACK_LIBRARY_PATH="/Library/Frameworks/Mono.framework/Versions/Current/lib:/usr/lib"
./gtkdemo

注意:您可以使用诸如http://sveinbjorn.org/platypus之类的打包工具将此gtkdemo应用程序打包到普通的OS-X应用程序中.将所有GTK库和任何其他所需的so / dylib打包到应用程序中并提供一个shell脚本,用于指定DYLIB路径为了找到那些基于应用程序的GTK库.然后,您可以分发自包含的应用程序,最终用户只需双击它即可运行基于GTK的应用程序.

点赞