Ken*_*man 5 .net c# mono mkbundle isis2
我正在使用mkbundle并尝试创建一个使用Isis2的小程序IdaTester的嵌入式版本.该系统反过来使用Mono中依赖MonoPosixHelper的功能
我的问题是mkbundle无法识别依赖项,我最终得到一个仍然需要动态链接〜/ bin/lib/libMonoPosixHelper.so的可执行文件,当我将此可执行文件移动到我不能运行的系统时会导致问题有Mono安装.实际上,捆绑包缺少应该静态链接的东西之一.
我的可执行文件确实有效,但前提是我确保只在具有"正确位置"动态库的机器上运行它.这违背了嵌入式可执行文件的目的......我希望能够将这个程序作为一种服务器交给他们,他们可以把它放在任何地方并作为二进制文件启动,显然如果他们需要安装库来实现这一点,服务器并不是完全独立的!
我看到如何强制mkbundle包含程序所依赖的任何dll文件,但是MonoPosixHelper不作为dll存在; 这是一个仅限Linux的库,仅作为共享库存在.有没有人知道一种"强制"捆绑静态嵌入它的方法?
如果这有帮助,我的小编译脚本如下:
mcs -debug+ IdaTester.cs Isis.cs -r:System.dll -r:Microsoft.CSharp.dll -r:Mono.Posix.dll
mkbundle --static -o IdaTester IdaTester.exe --deps
Run Code Online (Sandbox Code Playgroud)
然后我运行IdaTester; 这适用于可以找到libMonoPosixHelper库的平台,但是如果在尚未安装libMonoPosixHelper的平台上运行时尝试动态加载该库,则会在运行时失败...
据我所知,最好的选择是构建一个非共享 Mono 库,其中包含与当前在 MonoPosixHelper.so 中找到的相同方法,或者提供 MonoPosixHelper.so 的副本作为组件安装在与我的服务器相同的文件夹中。两者似乎都不理想:前者迫使我“接触”Mono 发行版,这会产生长期维护问题,而后者则迫使我进入更复杂的发行和安装模式。但似乎一旦生成了共享库,您就无法静态链接到该版本的库;Linux 加载器并不像处理更多标准库那样将此类东西视为库。
相反,如果我确实从相同的 .o 文件生成标准库,加载器将很乐意静态链接它,并且因为 mxbundle 最终运行 cc 并因此使用标准 ld,所以该选项对我有用。所以我想这就是我问题的答案。
| 归档时间: |
|
| 查看次数: |
1032 次 |
| 最近记录: |