9

我正在用 C# 编写一个跨平台的应用程序。它DllImport用于几个不同的库。它也是 x32 和 x64。它似乎适用于我自己编译的 .dll/.so。我将 x32 共享库放在 x32 子文件夹中,将 x64 共享库放在 x64 子文件夹中。

在通过 .net 框架的 Windows 上,我SetDllDirectory("x32" or "x64")根据当前运行时调用。在单声道上,通过 windows、linux 或 mac,我DllMap在 RandomLibrary.dll.config 中使用 ,。它适用于位于 x32 或 x64 目录中的文件。

但是,我也DllImport用于我没有编写的库,例如 FreeType2。在 Windows 上,我只是将构建的库放在两个子文件夹中。但是在 linux 上,我宁愿使用可以通过友好的本地包管理器安装的 libfreetype6 库。我可以将 DllMap 链接硬编码到/usr/lib/x86_64-linux-gnu/libfreetype.so.6,但我假设 freetype 文件会根据您使用的发行版而改变。

有没有什么简单的方法可以找到 libfreetype.so 而不管我使用的是什么发行版?

4

2 回答 2

3

在 Linux 上使用 DllImport("libfreetype.so.6") 就足够了,因为系统应该配置为正确处理它。确保您安装了正确的软件包。如果它不起作用,则可能是系统配置错误:发布您得到的错误、LD_LIBRARY_PATH env var 值、/etc/ld.so.conf 的内容和 /etc/ld.so.conf.d 中的文件/。的输出

/sbin/ldconfig -p |grep 自由类型

也会很有用。

于 2012-08-10T08:08:09.800 回答
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 文档似乎暗示目标值不是路径,但我不能确定。

另一种方法是使用简单的 shellscript 或批处理文件。arch在 linux 上,shell 脚本可以通过调用和相应的设置来轻松地计算出架构LD_LIBRARY_PATH。我通常更喜欢我的单声道程序的外壳包装器(MyProgram.exe在控制台上看到感觉很难看)

最后,如果您使用dlopenLoadLibarary预加载您的共享库,您可能会获得更多乐趣。

当您的托管应用程序启动时,您决定您是什么架构,然后dlopen()在 linux 或LoadLibaray()Windows 上使用。

于 2012-08-11T06:59:09.227 回答