gpt4 book ai didi

Linux 上 .NET Core 中的 C# : Referencing or using . so 文件

转载 作者:太空宇宙 更新时间:2023-11-04 10:07:40 25 4
gpt4 key购买 nike

我们在 .NET Framework 上有一个项目引用了 Fico Xpress 求解器 dll。所需的 dll 是 –

  • Xprb.dll
  • Xprbdn.dll
  • Xprsdn.dll

由于没有可用于使用 Fico Xpress Solver 的 nuget 包,我们安装了 Fico Xpress Solver 并将这些 dll 从安装目录复制到项目文件夹内名为 lib 的本地文件夹,并添加了路径引用到 lib 文件夹中的这些 dll。所以在编译的时候,项目会使用这些dll的引用(存在于lib文件夹中)进行编译。该项目成功构建。当我们的项目调用 Fico Xpress Solver 时,会从安装目录 使用上述所需的 dll,这可能是通过环境变量 访问的(本地文件夹中的 dll 只是为了成功编译代码,我们可以将它指向实际的 Fico Xpress Solver 安装目录,但我们将 dll 放在 lib 文件夹中,以便我们可以将它添加到 SVN)并且项目成功运行使用Fico Xpress 求解器。

现在,我们已经将项目移植到 .NET Core,以便在 Linux 机器上运行。于是我们在linux机器上安装了Fico Xpress Solver,通过/opt/xpressmp/bin/文件夹(这是linux机器的默认安装目录)里面的optimizer可执行文件来测试安装是否成功.安装成功,Fico Xpress Solver 运行正常(已使用其网站上提供的方法进行检查)。

当我们构建项目时,它编译成功,因为它仍然引用本地 lib 文件夹中所需的 dll。但是,当我们的项目在运行时调用 Fico Xpress Solver 时,它会失败,因为它无法加载所需的 dll(它可能正在搜索 LD_LIBRARY_PATH 设置为 /opt/xpressmp/lib/ 由安装手册中指定的/opt/xpressmp/bin/xpvars.sh 脚本设置。此文件夹包含所有.so 文件并且没有 dll 文件。)错误如下 –

Unable to load shared library 'xprb.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libxprb.dll: cannot open shared object file: No such file or directory

我们不确定我们使用的方法,即使用 dll 来编译和运行是否正确,或者我们是否必须了解如何使用 .so 文件来编译和运行项目。由于代码构建成功,我们希望它能运行,但找不到共享对象文件。

有人可以指定一种在 Linux 中使用 Xpress 求解器的方法,或者在 Windows 上然后在 Linux 上使用相同的第 3 方软件时需要遵循的一些一般准则。我们是否需要更改代码或添加对 .so 的引用而不是 .dll 文件

DllImport 是执行此操作的唯一方法吗(在不同的博客上建议)

最佳答案

我们终于想出了一个办法,但我们不确定它是否适用于所有人,而且它可能不会解决其他人的问题。这是我们的方法 -

如问题中所述,xprb.dll 无法加载,因为 libxprb.dll 是它在 Xpress lib 目录 (/opt/随心/库/)。但是在 Linux 中安装 Xpress 后,安装只有 .so 文件而没有 .dll 文件

有一些博客建议使用 DllImport 方法加载 .so 文件,然后调用方法。我们没有尝试这些方法,因为我们正在寻找比这更简单的方法。

在解决这个问题之后我们发现,只有当我们将共享库的加载指向以某种方式安装的 .so 文件时,它才可能起作用。所以在我们的具体情况下情况就是这样 -

  • 我们在/opt/xpressmp/lib/文件夹中没有 libxprb.dll
  • 我们在/opt/xpressmp/lib/文件夹中有 libxprb.so 文件而不是 libxprb.dll(如果我们没有这个文件,我们可能不知道还有哪个 . so文件使用)

因此我们在/opt/xpressmp/lib/文件夹中创建了一个符号链接(symbolic link)文件 libxprb.dll(只要它位于 LD_LIBRARY_PATH 中的某个路径中,我们就可以将其放置在任何位置) 使用命令指向/opt/xpressmp/lib/文件夹中的 libxprb.so 文件 -

ln -s/opt/xpressmp/lib/libxprb.dll/opt/xpressmp/lib/libsprb.so

现在当 xprb.dll 被加载时,它会查找 libxprb.dll,后者又指向 libxprb.so 文件(因为 libsprb.dll 是 libxprb.so 的符号链接(symbolic link)),因此 xprb.dll 被成功加载。

关于Linux 上 .NET Core 中的 C# : Referencing or using . so 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51166866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com