我有一个用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?请帮帮我。
答案 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是这些库的包装。