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

时间:2015-10-11 08:48:11

标签: macos xamarin mono gtk gtk#

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

我只是使用

将Mono与我的exe文件捆绑在一起
mkbundle --static hello.exe -o --deps hello2.exe

我收到了exe文件,但是当我拖动它并把它放在终端上时我得到System.DllNotFound Exception: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?请帮帮我。

2 个答案:

答案 0 :(得分:2)

错误来自于未找到GTK共享对象库(SO / dylib)。

使用mkbundle

如果使用32位Mono,则需要为AS和CC分配拱门类型。默认情况下,clang会编译并链接x86_64,这可能与您安装的Mono's 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等等,否则将显示您收到的错误。< / p>

将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打包到app中,并提供一个shell脚本来分配DYLIB路径,以便找到那些基于app的GTK库。然后,您可以分发自包含的app,最终用户只需双击它即可运行基于GTK的应用。

答案 1 :(得分:0)

由于gkt#是一个开源库,为什么不下载代码呢? 您需要安装git并执行: git clone https://github.com/mono/gtk-sharp

然后,您可以直接在解决方案中引用那些已经下载的gtk-sharp项目。

注意:我相信您仍然需要本机OSXs gtk库,因为gtk-sharp是这些库的包装。