1

静的にリンクされた glew32mxsd.lib を使用して、Windows で単純な OpenGL プログラムをコンパイルしようとしています... glfw も使用しており、glew なしでコンパイルするとすべてが機能します。

glew src をダウンロードし、ソースから静的 mx デバッグ ライブラリをビルドしました。次に、結果の glew32mxsd.lib ファイルをプロジェクト ディレクトリにコピーしました。私はcmakeを使用しているので、私のcmakeコードは次のようになります。

SET (GLEW_VERSION    1.9.0)
SET (GLEW_DIRECTORY  ${EXTERNAL_LIBS}/glew/${GLEW_VERSION})
SET (GLEW_INCLUDES   ${GLEW_DIRECTORY}/include)
SET (GLEW_LIBS       ${GLEW_DIRECTORY}/win/${SYSTEM_ARC}/lib)
INCLUDE_DIRECTORIES (${GLEW_INCLUDES})

ADD_EXECUTABLE (myproject ${HEADER_FILES} ${SOURCE_FILES})

TARGET_LINK_LIBRARIES(engine OpenGL32.lib)
TARGET_LINK_LIBRARIES(engine ${GLEW_LIBS}/glew32mxsd.lib)

また、私のソースでは、ヘッダーで次を使用しています

#define GLEW_STATIC
#define GLEW_MX
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#ifdef WIN32
  #include <GL/wglew.h>
#endif

//-----------------------------------------------------------------
static GLEWContext *glewGetContext()
{
  return nullptr;
}

すべてがエラーなしでコンパイルおよびリンクされますが... プログラムを実行すると、メモリ アクセス エラーが発生します。コールスタックは

engine.exe!glewContextInit(GLEWContextStruct * ctx) Line 8912   C
engine.exe!cext::graphics::internal::WindowManager::initGLExtentions() Line 204 C++
engine.exe!cext::graphics::WindowManager::initGLExtentions() Line 273   C++
engine.exe!main(int argc, char * * argv) Line 363   C++
engine.exe!__tmainCRTStartup() Line 536 C
engine.exe!mainCRTStartup() Line 377    C

glew.c の 8912 行を見ると、次の行が表示されます。

CONST_CAST(GLEW_VERSION_4_3)   = ( major > 4 ) || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE;

私の glewInit は次のようになります

void initGLExtentions()
{
  glewExperimental = true;
  GLenum err = glewInit();
  if (GLEW_OK != err)
  {
     printf("Error: %s\n",glewGetErrorString(err));
  }
  printf("Status: Using GLEW %s\n",glewGetString(GLEW_VERSION));
  if (!GLEW_ARB_vertex_buffer_object)
  {
    printf("VBO not supported\n");
    exit(EXIT_FAILURE);
  }
}
...
glfwWindow *window = makeWindow(options,hints);
if (!window)
{
  fprintf( stderr, "Failed to open GLFW window\n" );
  glfwTerminate();
  exit( EXIT_FAILURE );
}

glfwMakeContextCurrent(window);
initGLExtentions();

Macで同じコードを使用しても問題なく動作するため、静的ライブラリに関係していると思われます。ただし、glew Web サイトのすべての指示に従った後でも、まだ何かが足りないに違いありません。

編集: 追加情報 別のスレッドでそれについて読んだ後、アプリケーションで依存関係ウォーカーを実行しました。私のexeファイルで依存関係ウォーカーを実行すると、次の欠落ファイルが生成されます

API-MS-WIN-CORE-COM-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
API-MS-WIN-SHCORE-SCALING-L1-1-0.DLL
DCOMP.DLL
GPSVC.DLL
IESHIMS.DLL

これらは USER32.DLL から呼び出されます。とにかく、これらは glew.lib または wglew.lib に関連していますか?

4

0 に答える 0