我写在C#中,它是跨平台的应用程序。 它使用DllImport
几个不同的库。 这也是既X32和x64。 看来工作适合我自己编译的.dll /的.so。 我把在X32子文件夹中的X32共享库,以及64共同在64子文件夹库。
在通过.NET框架的窗户我称之为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不管我用什么发行版?
使用的DllImport为Linux(“libfreetype.so.6”)应该是不够的,因为该系统应配置正确处理它。 请确保你安装了正确的软件包。 如果不工作,你可能有一个错误配置的系统:在发布你/etc/ld.so.conf.d得到错误,LD_LIBRARY_PATH的环境变量的值,/etc/ld.so.conf文件的内容和文件/。 输出
/ sbin目录/ -p LDCONFIG | grep的的FreeType
将是有用的。
单吃东西/程序专门为此,它被称为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文档似乎暗示,目标值是不是一个路径,但我不能肯定。
另一种方法是有一个简单的shell脚本或批处理文件。 Linux上的shell脚本可以很容易地通过调用制定出建筑arch
并设置LD_LIBRARY_PATH
相应。 我一般喜欢在我的节目单壳包装(看到MyProgram.exe
在控制台上的感觉丑陋)
最后,如果你的PInvoke到你可能有更多的乐趣 的dlopen或LoadLibarary预加载共享库。
当你的管理应用程序启动你决定你是什么样的架构,然后使用dlopen()
,如果在Linux或LoadLibaray()
如果在Windows上。