문제

내 프로그램이 그렇게 몇몇 그래픽입니다.을 실행할 때 그것은 대화식으로 그것을 원하 OpenGL 을 사용하는 시스템에서 제공하는 하드웨어 가속화된 그래픽입니다.을 실행할 때에 그것을 일괄 처리할 수 있을 리디렉션을 사용하여 메사 GL 도록 라이브러리를 사용할 수 있는 기준을 검사해 파일 종류를 파악합 기능은 렌더링하는 오프스크린 버퍼입니다.의 기준을 검사해 파일 종류를 파악합 기능을 사용할을 수행하여 LoadLibrary/getprocaddress 에는 경우에는 배치 시작 옵션을 선택합니다.

리눅스에서,그것의 매우 쉽게 이 작업을 확인합니다.를 사용하여 랩퍼 스크립트를 호출하는 프로그램,내가 다음과 같이 할 수 있다:

if [ "$OPTION" = "batch" ]; then
  export LD_LIBRARY_PATH=$PATHTO/mesalibs:$LD_LIBRARY_PATH
fi

그것은 가능한 무언가를 하는 이 Windows?

을 때 나를 추가하려고 디렉토리로 PATH 환경변수 프로그램을 계속하고 이동을 시스템 opengl32.dll.유일한 방법은 나를 얻을 수 있는 프로그램을 사용하여 메사 GL/지 기준을 검사해 파일 종류를 파악합 공유 라이브러리는 그들을 가지고 있에서와 같은 디렉토리 나의 프로그램입니다.그러나 제가 그렇게 한다는 것은,프로그램을 사용하지 않 시스템 opengl32.dll.

도움이 되었습니까?

해결책

내가 무엇을 말하고 있는지 이해하면 프로세스가 시작될 때, 로드 타임 동적 연결 . 이것을 변경하지 않고 문제를 해결할 수있는 좋은 방법은 아닙니다.

편리하게 사용할 수 없습니다 Qt 라이브러리에서 호출이 오는 opengl32.dll의 런타임 동적 연결 (loadlibrary / getprocaddress). 그러나 Qt 라이브러리가 자체가 동적으로 연결되어 있으므로 런타임 링크를 사용하여 문제를 해결할 수 있어야합니다. 이 시나리오에서는 Qt 라이브러리를로드하기 전에 OpenGl32.dll을로드 한 경우로드 할 OpenGl32.dll 버전을 명시 적으로 선택할 수 있어야합니다.

지연된로드 지연 를 사용하여 간단하게하기 위해 고려해야 할 것입니다. 로드 시간에서 런타임 링크로 이동하는 과정. 이 시나리오에서 QT 라이브러리에 대한 첫 번째 호출은 자동으로로드 될 수 있으며 OpenGl32.dll을 먼저 명시 적으로로드 할 필요가 있습니다.

다른 팁

라이브러리 및 해당 이름 / 위치에 따라 다룰 수있는 몇 가지 방법이 있습니다.

둘 다 같은 이름 (opengl32.dll)이 있으면 시스템 디렉토리가 이전에 검색 경로에 메사 DLL 위치를 추가해야합니다. 주문 디렉토리는 여기 . 볼 수 있듯이 $PATH가 시스템 이후에 마지막으로 나옵니다. 디렉토리를 추가 할 수 없습니다. 그러나 작업 디렉토리를 메사 파일이 포함 된 경로로 설정하여 두 번째 단계 ( "현재 디렉토리")를 사용할 수 있습니다. 일반적으로 이것은 파일이 들어있는 디렉토리에있는 동안 절대 경로를 사용하여 응용 프로그램을 시작하는 것을 의미합니다.

아직도 특히 즐겁지 않은 것입니다. 가능한 경우 앱이 시작될 때 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 변수를 사용하여 프로그램의 수명에 대한 결과를 캐시 할 수도 있습니다. 또한 다른 라이브러리에 대해 다른 기능 이름을 사용할 수도 있지만 조금 더 많은 논리가 필요합니다. 그래서 세부 정보를 당신에게 두십시오.

cmd 창 에서이 가능하지만 운이 아닌 것 같습니다.

시도 : 스크립트 (running_in_script= y)의 변수를 설정 한 다음 실행 파일의 절대 경로에서 실행 파일 및 loadLibrary에서 해당 변수를 구문 분석합니다. exit 할 때 변수를 지우십시오.

윈도우 사용하여 검색에 대한 다른 경로는 동적 라이브러리는,그러나 때문에 보안을 고려하면,시스템 경로를 먼저 검색.

할 수 있습,그러나 사용이 지연을 로드하의 수입을 얻을 해결 방법:

를 사용하는 경우 MSVC 할 수 있는 단일웃 Dll 관심있는에서 선적에 자신 /DELAYIMPORT 깃발을 링커.

그런 다음,재정의 지연 부하를 도우미 기능 고 사용 LoadLibrary 을 찾기 위해 적절한 DLL(그리고 그것을 믿지 시스템).

로드 후 정확한 DLL,귀하의 도우미 기능을은 원래 하는 것 모든 GetProcAddress 비즈니스 자체.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top