Я следую учебному пособию по OpenGL (в Windows). Я пытаюсь использовать glfw для создания графического контекста, но не могу получить статическую библиотеку, которую я скачал, для ссылки на мой исходный код. Если я вместо этого использую DLL GLFW, все работает, и я могу запустить свою программу, но я бы предпочел не иметь зависимости во время выполнения от DLL GLFW.
Моя текущая структура каталогов выглядит так:
root_folder:
externs:
GLFW:
glfw3.lib
glfw3.h
glfw3native.h
window.c
Я компилирую свой код с помощью этой команды:
gcc window.c -o window.exe -L externs/GLFW -lglfw3 -lopengl32
Однако, когда я делаю это, я получаю этот неприятный (и ужасно длинный) вывод:
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
externs/GLFW/glfw3.lib(glfw.dir/Release/window.obj):(.text$mn+0x29e): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/window.obj):(.xdata[$unwind$glfwCreateWindow]+0x10): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/input.obj):(.text$mn+0x286): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/input.obj):(.text$mn+0x790): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/input.obj):(.xdata[$unwind$glfwUpdateGamepadMappings]+0xc): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/input.obj):(.xdata[$unwind$parseMapping]+0x10): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/init.obj):(.text$mn+0x73): undefined reference to `__imp___stdio_common_vsprintf'
externs/GLFW/glfw3.lib(glfw.dir/Release/init.obj):(.text$mn+0x327): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/init.obj):(.xdata[$unwind$_glfwInputError]+0xc): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/context.obj):(.text$mn+0x3be): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/context.obj):(.xdata[$unwind$_glfwRefreshContextAttribs]+0x18): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x50): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x1a7): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x50): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x1cb): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x84): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x3ec): more undefined references to `__security_check_cookie' follow
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0xcb): undefined reference to `__imp_CreateDIBSection'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x10f): undefined reference to `__imp_CreateBitmap'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x131): undefined reference to `__imp_DeleteObject'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x1d3): undefined reference to `__imp_DeleteObject'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x1dc): undefined reference to `__imp_DeleteObject'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x20d): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x36e): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x91): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x8e): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x67): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x50): undefined reference to `__imp_CreateRectRgn'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0xd6): undefined reference to `__imp_DeleteObject'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x167): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.text$mn+0x76a): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.xdata[$unwind$_glfwPlatformSetWindowPos]+0xc): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.xdata[$unwind$_glfwPlatformGetWindowSize]+0xc): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.xdata[$unwind$_glfwPlatformSetWindowSize]+0x8): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.xdata[$unwind$_glfwPlatformSetWindowSizeLimits]+0x8): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.xdata[$unwind$_glfwPlatformSetWindowAspectRatio]+0x8): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_window.obj):(.xdata[$unwind$_glfwPlatformGetFramebufferSize]+0xc): more undefined references to `__GSHandlerCheck' follow
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x57): undefined reference to `__imp_GetDeviceCaps'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x69): undefined reference to `__imp_GetDeviceCaps'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x38): undefined reference to `__imp_CreateDCW'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x49): undefined reference to `__imp_GetDeviceGammaRamp'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x52): undefined reference to `__imp_DeleteDC'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x196): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x5b): undefined reference to `__imp_GetDeviceCaps'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x6d): undefined reference to `__imp_GetDeviceCaps'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x82): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x91): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x9b): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x207): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x45): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x19a): undefined reference to `__imp_CreateDCW'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x1ab): undefined reference to `__imp_SetDeviceGammaRamp'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x1b4): undefined reference to `__imp_DeleteDC'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x1cc): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x2f3): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x17f): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0xa8): undefined reference to `__imp_CreateDCW'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0xcc): undefined reference to `__imp_GetDeviceCaps'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0xdd): undefined reference to `__imp_GetDeviceCaps'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x10c): undefined reference to `__imp_GetDeviceCaps'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x141): undefined reference to `__imp_GetDeviceCaps'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x162): undefined reference to `__imp_DeleteDC'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x2c0): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0xb7): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.xdata[$unwind$_glfwPollMonitorsWin32]+0x20): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.xdata[$unwind$_glfwSetVideoModeWin32]+0x10): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.xdata[$unwind$_glfwPlatformGetMonitorPos]+0x14): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.xdata[$unwind$_glfwPlatformGetMonitorWorkarea]+0x10): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.xdata[$unwind$_glfwPlatformGetVideoModes]+0x10): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.xdata[$unwind$_glfwPlatformGetVideoMode]+0x14): more undefined references to `__GSHandlerCheck' follow
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.text$mn+0x1d3): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.text$mn+0x10e): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.text$mn+0x233): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.text$mn+0x39b): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.text$mn+0x60): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.text$mn+0x518): more undefined references to `__security_check_cookie' follow
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.xdata[$unwind$_glfwInitJoysticksWin32]+0x8): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.xdata[$unwind$_glfwDetectJoystickConnectionWin32]+0x8): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.xdata[$unwind$_glfwDetectJoystickDisconnectionWin32]+0x14): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.xdata[$unwind$_glfwPlatformPollJoystick]+0x28): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.xdata[$unwind$_glfwPlatformUpdateGamepadGUID]+0x8): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_joystick.obj):(.xdata[$unwind$deviceObjectCallback]+0x10): more undefined references to `__GSHandlerCheck' follow
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.text$mn+0xe7): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.text$mn+0x97): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.text$mn+0xbc): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.text$mn+0x3bc): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.text$mn+0x1d2): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.text$mn+0x48): more undefined references to `__security_check_cookie' follow
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.xdata[$unwind$_glfwIsWindowsVersionOrGreaterWin32]+0x10): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.xdata[$unwind$_glfwIsWindows10BuildOrGreaterWin32]+0xc): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.xdata[$unwind$_glfwInputErrorWin32]+0x10): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.xdata[$unwind$_glfwUpdateKeyNamesWin32]+0x20): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.xdata[$unwind$_glfwPlatformInit]+0xc): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/win32_init.obj):(.xdata[$unwind$loadLibraries]+0x8): more undefined references to `__GSHandlerCheck' follow
externs/GLFW/glfw3.lib(glfw.dir/Release/osmesa_context.obj):(.text$mn+0x21b): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/osmesa_context.obj):(.text$mn+0x4c): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/osmesa_context.obj):(.text$mn+0x1cd): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/osmesa_context.obj):(.xdata[$unwind$_glfwInitOSMesa]+0xc): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/osmesa_context.obj):(.xdata[$unwind$_glfwCreateContextOSMesa]+0x10): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/egl_context.obj):(.text$mn+0x4b7): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/egl_context.obj):(.text$mn+0x49): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/egl_context.obj):(.text$mn+0x534): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/egl_context.obj):(.xdata[$unwind$_glfwInitEGL]+0x10): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/egl_context.obj):(.xdata[$unwind$_glfwCreateContextEGL]+0x18): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x94): undefined reference to `__imp_DescribePixelFormat'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0xc2): undefined reference to `__imp_SetPixelFormat'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x447): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x2d): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x6c): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x17c): undefined reference to `__imp_ChoosePixelFormat'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x18c): undefined reference to `__imp_SetPixelFormat'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x3a3): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x158): undefined reference to `__imp_DescribePixelFormat'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x61c): undefined reference to `__imp_DescribePixelFormat'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x77f): undefined reference to `__security_check_cookie'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.text$mn+0x81): undefined reference to `__imp_SwapBuffers'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.xdata[$unwind$_glfwInitWGL]+0xc): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.xdata[$unwind$_glfwCreateContextWGL]+0x14): undefined reference to `__GSHandlerCheck'
externs/GLFW/glfw3.lib(glfw.dir/Release/wgl_context.obj):(.xdata[$unwind$choosePixelFormat]+0x10): undefined reference to `__GSHandlerCheck'
collect2.exe: error: ld returned 1 exit status
Просто ради удовольствия я заменил glfw3.lib на glfw3.dll (которая была в той же загрузке). Если я запускаю ту же команду компиляции, gcc успешно создает файл window.exe, который, если я копирую glfw3.dll в root_folder, создает окно, как и ожидалось. Пока это нормально, но, очевидно, я не люблю иметь glfw.dll во время выполнения, особенно в моем каталоге верхнего уровня.
Вот код в window.c, но я сомневаюсь, что он имеет какое-либо отношение к моей проблеме (это именно начальный код на сайте GLFW с путем включения, скорректированным для моей структуры каталогов):
#include "externs/GLFW/glfw3.h"
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
Я немного погуглил, и, похоже, что .lib-файл также требует, чтобы я связывался с другими библиотеками Windows (Интернет предлагает соединение с user32, хотя я собираю для 64-битной версии), но добавляю -luser32
к своему Компиляция, похоже, не помогает. Чего я не понимаю, так это того, почему в DLL нет этой проблемы. Мне кажется, что в обоих случаях мне нужно либо связываться с библиотеками Windows, либо не связываться вообще. Как я могу разрешить дополнительные зависимости из статической библиотеки?
Кроме того (это побочный вопрос, который больше подходит только для удовлетворения моего любопытства, но не является частью реального вопроса в этом посте), почему я должен иметь glfw3.dll в той же папке, что и мой исполняемый файл, чтобы запустить его? Конечно, это не общее требование - есть ли флаг, который я могу добавить к gcc, чтобы указать, где он должен искать dll во время выполнения?
Я надеюсь, что это сравнительно простая проблема, я использую gcc для компиляции своих заданий в школе, но я впервые пытаюсь установить связь с внешними библиотеками, поэтому есть большая вероятность, что я упустил что-то очевидное.
Большое спасибо!
Обновление: учебник только что заставил меня добавить GLEW, и я получил тот же тип проблемы; Я могу работать с DLL GLEW, но если я пытаюсь связать со статической библиотекой, я получаю кучу ошибок при попытке связать.