首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在Windows中模拟LD_LIBRARY_PATH?

有没有办法在Windows中模拟LD_LIBRARY_PATH?
EN

Stack Overflow用户
提问于 2012-01-26 03:04:36
回答 4查看 21.1K关注 0票数 7

我有一个程序做一些图形。当我以交互方式运行它时,我希望它使用系统中的OpenGL来提供硬件加速图形。当我批量运行它时,我希望能够将它重定向到使用Mesa库,这样我就可以使用OSMesa功能渲染到屏幕外缓冲区。如果选择了batch start up选项,则通过执行LoadLibrary/GetProcAddress来启用OSMesa功能。

在Linux上,很容易做到这一点。通过使用包装器脚本调用程序,我可以执行以下操作:

代码语言:javascript
复制
if [ "$OPTION" = "batch" ]; then
  export LD_LIBRARY_PATH=$PATHTO/mesalibs:$LD_LIBRARY_PATH
fi

在Windows中可以做到这一点吗?

当我尝试向PATH变量添加目录时,程序继续转到系统opengl32.dll。我可以让程序使用Mesa GL/OSMesa共享库的唯一方法是让它们与我的程序驻留在相同的目录中。但是,当我这样做时,程序将永远不会使用系统opengl32.dll。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-01 12:04:09

如果我没理解错的话,你的进程启动时加载的是错误版本的opengl32.dll,也就是load-time dynamic linking。如果不改变这一点,可能没有好的方法来解决你的问题。

您说您不能方便地使用opengl32.dll的run-time dynamic linking (LoadLibrary/GetProcAddress),因为对它的调用来自Qt库。我假设Qt库本身是动态链接的,因此您应该能够通过使用运行时链接来解决您的问题。在这种情况下,假设您在加载Qt库之前加载了opengl32.dll,您应该能够显式地选择要加载的opengl32.dll版本。

您可能希望考虑使用delayed loading,以简化从加载时链接到运行时链接的过程。在这个场景中,第一次调用Qt库会自动加载它,您只需要先显式加载opengl32.dll即可。

票数 7
EN

Stack Overflow用户

发布于 2012-01-30 21:58:39

有几种方法可以处理此问题,具体取决于库及其名称/位置:

如果两者具有相同的名称(opengl32.dll),则需要将Mesa DLL位置添加到搜索路径,以便在搜索系统目录之前对其进行搜索。签入目录的顺序是详细的here。如您所见,$PATH位于system之后,所以您不能简单地将目录添加到其中。但是,您可以通过将工作目录设置为包含mesa文件的路径来利用第二步(“当前目录”)。通常,这意味着在包含文件的目录中使用绝对路径启动应用程序。

不过,这仍然不是特别令人愉快。如果可以,您应该在应用程序启动时使用LoadLibrary并检查环境变量(OPENGL_LIBRARY_PATH)。假设从opengl32.dll和Mesa的DLL导出的内容相同,您可以执行以下操作:

代码语言:javascript
复制
void LoadExports()
{
    char location[MAX_PATH];
    getenv("OPENGL_LIBRARY_PATH", location);
    HMODULE oglLib = LoadLibrary(location);

    function1 = GetProcAddress(oglLib, "glVertex2f");
    ...
}

这将非常好地工作,几乎完全可以做你想做的。

然而,如果你想这样做,你不能导入opengl32.dll,你可能正在做的,你必须在整个过程中动态链接。确保不链接到opengl32.lib,这样就没问题了。根据您使用了多少函数,设置起来可能会很痛苦,但是代码可以很容易地脚本化,只需要完成一次,您还可以使用static变量在程序的生命周期内缓存结果。也可以为不同的库使用不同的函数名,尽管这需要更多的逻辑,所以我将把细节留给您。

票数 1
EN

Stack Overflow用户

发布于 2012-01-26 03:08:47

虽然这在cmd窗口中应该是可能的,但看起来您没有运气。

尝试:在脚本(RUNNING_IN_SCRIPT=Y)中设置一个变量,然后从安装的绝对路径中解析可执行文件和LoadLibrary中的该变量-确保在退出时清除该变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9008618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档