我有一个程序做一些图形。当我以交互方式运行它时,我希望它使用系统中的OpenGL来提供硬件加速图形。当我批量运行它时,我希望能够将它重定向到使用Mesa库,这样我就可以使用OSMesa功能渲染到屏幕外缓冲区。如果选择了batch start up选项,则通过执行LoadLibrary/GetProcAddress来启用OSMesa功能。
在Linux上,很容易做到这一点。通过使用包装器脚本调用程序,我可以执行以下操作:
if [ "$OPTION" = "batch" ]; then
export LD_LIBRARY_PATH=$PATHTO/mesalibs:$LD_LIBRARY_PATH
fi在Windows中可以做到这一点吗?
当我尝试向PATH变量添加目录时,程序继续转到系统opengl32.dll。我可以让程序使用Mesa GL/OSMesa共享库的唯一方法是让它们与我的程序驻留在相同的目录中。但是,当我这样做时,程序将永远不会使用系统opengl32.dll。
发布于 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即可。
发布于 2012-01-30 21:58:39
有几种方法可以处理此问题,具体取决于库及其名称/位置:
如果两者具有相同的名称(opengl32.dll),则需要将Mesa DLL位置添加到搜索路径,以便在搜索系统目录之前对其进行搜索。签入目录的顺序是详细的here。如您所见,$PATH位于system之后,所以您不能简单地将目录添加到其中。但是,您可以通过将工作目录设置为包含mesa文件的路径来利用第二步(“当前目录”)。通常,这意味着在包含文件的目录中使用绝对路径启动应用程序。
不过,这仍然不是特别令人愉快。如果可以,您应该在应用程序启动时使用LoadLibrary并检查环境变量(OPENGL_LIBRARY_PATH)。假设从opengl32.dll和Mesa的DLL导出的内容相同,您可以执行以下操作:
void LoadExports()
{
char location[MAX_PATH];
getenv("OPENGL_LIBRARY_PATH", location);
HMODULE oglLib = LoadLibrary(location);
function1 = GetProcAddress(oglLib, "glVertex2f");
...
}这将非常好地工作,几乎完全可以做你想做的。
然而,如果你想这样做,你不能导入opengl32.dll,你可能正在做的,你必须在整个过程中动态链接。确保不链接到opengl32.lib,这样就没问题了。根据您使用了多少函数,设置起来可能会很痛苦,但是代码可以很容易地脚本化,只需要完成一次,您还可以使用static变量在程序的生命周期内缓存结果。也可以为不同的库使用不同的函数名,尽管这需要更多的逻辑,所以我将把细节留给您。
发布于 2012-01-26 03:08:47
虽然这在cmd窗口中应该是可能的,但看起来您没有运气。
尝试:在脚本(RUNNING_IN_SCRIPT=Y)中设置一个变量,然后从安装的绝对路径中解析可执行文件和LoadLibrary中的该变量-确保在退出时清除该变量。
https://stackoverflow.com/questions/9008618
复制相似问题