我正在用C#编写一个应用程序,它是跨平台的。它使用DllImport
用于几个不同的库。它也是x32和x64。
它似乎适用于我自己编译的.dll / .so。我将x32共享库放在x32子文件夹中,将x64共享库放在x64子文件夹中。
在Windows上通过.net框架我根据当前情况调用SetDllDirectory("x32" or "x64")
运行。在mono上,通过windows,linux或mac,我在RandomLibrary.dll.config中使用DllMap
。它适用于位于x32或x64目录中的文件。
但是,对于我没有编写的库,我也使用DllImport
,例如FreeType2。在Windows上,我只是将构建的库推送到两个子文件夹中。但是在Linux上我宁愿使用你可以通过友好的本地包管理器安装的libfreetype6库。我可以将DllMap链接硬编码到/usr/lib/x86_64-linux-gnu/libfreetype
。so.6,但我认为freetype文件会根据您使用的发行版而改变。
有什么简单的方法可以找到libfreetype.so,无论我使用什么发行版?
答案 0 :(得分:2)
对Linux使用DllImport(“libfreetype.so.6”)就足够了,因为系统应配置为正确处理它。确保安装了正确的软件包。 如果它不起作用,您可能有一个配置错误的系统:发布您获得的错误,LD_LIBRARY_PATH env var值,/etc/ld.so.conf的内容和/etc/ld.so.conf.d中的文件/。
的输出/ sbin / ldconfig -p | grep freetype
也很有用。
答案 1 :(得分:2)
Mono专门为此设置了一个事物/程序,它被称为DllMap。您可以指定在哪个平台上加载哪个非托管libaray。例如:
<configuration>
<dllmap dll="foobar" os="linux" wordsize="64" target="linux/amd64/libfoobar.so" />
<dllmap dll="foobar" os="linux" wordsize="32" target="linux/i386/libfoobar.so" />
</configuration>
我自己没有尝试过上述内容 - dllmap文档似乎暗示目标值不是路径,但我无法确定。
另一种方法是使用简单的shellcript或批处理文件。在Linux上,shell脚本可以通过调用arch
并相应地设置LD_LIBRARY_PATH
来轻松地计算出架构。我通常更喜欢围绕我的单声道程序的shell包装器(在控制台上看到MyProgram.exe
感觉很难看)
如果您转到dlopen或LoadLibarary预加载共享库,最后您可能会有更多有趣。
当您的托管应用启动时,您决定使用的是哪种架构,然后在Linux上使用dlopen()
,在Windows上使用LoadLibaray()
。