Статическая компиляция glfw
Я пытаюсь скомпилировать glfw как статическую ссылку на Linux Mint (на основе Ubuntu 10.04), используя GCC 4.4.3.
Внутри моего каталога проекта я получил "external/glfw", который содержит исходный код glfw 2.7.1. Я скомпилировал его, запустив "make x11-install", который дает:
- /usr/local/include/GL/glfw.h
- /usr/local/lib/libglfw.a
- /usr/local/lib/pkgconfig/libglfw.pc
я также получил этот простой код в test.c:
#include <stdio.h>
#include <stdlib.h>
#include "external/glfw/include/GL/glfw.h"
int main( int argc, char const* argv[] )
{
if( !glfwInit() ){
fprintf( stderr, "glfwInit Failed\n" );
}
glfwOpenWindowHint( GLFW_FSAA_SAMPLES, 4 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 1 );
glfwOpenWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
// Open a window and create its OpenGL context
if( !glfwOpenWindow( 1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW )){
fprintf( stderr, "glfwOpenWindow failed\n" );
glfwTerminate();
return -1;
}
return 0;
}
я пытаюсь скомпилировать glfw как статическую ссылку и скомпилировал код, используя gcc с флагами:
/usr/bin/gcc `pkg-config --cflags libglfw` -o test test.c \
`pkg-config --libs libglfw` -lXrandr -lX11 -lGLU -lGL -pthread -lm
и это не дает мне никакой ошибки. но когда я пытаюсь выполнить двоичный файл, это показывает, что мне не удалось вызвать glfwOpenWindow.
кто-нибудь может мне помочь, пожалуйста? спасибо за ваше время, ребята!
ура!
п
РЕДАКТИРОВАТЬ 1: Я думаю, что проблема заключается в процессе ссылки, а не код. Потому что, если у меня установлены libglfw2 и libglfw-dev (пакеты ubuntu), то исполняемый файл работает нормально. Здесь я хочу, чтобы glfw был статически связан, а не полагался на библиотеки lib для дистрибутива дистрибутива.
РЕДАКТИРОВАТЬ 2 согласно предложению datenwolf, которое я пытался отладить с помощью GDB. Я никогда не использовал GDB, но я часто использую Perl отладчик. как-то они имеют много общего. я перекомпилирую glfw и мой test.c с -ggdb.
при использовании gdb он показывает, что мой код входит в glfwOpenWindow(), который находится в "window.c" в исходном коде glfw. Так как я новичок в GDB, я не знаю, как оценить выражение или получить значение переменных. на основе быстрого поиска в Google все, что я знаю, это "Whatis", чтобы увидеть тип даты. но я думаю, что мой код останавливается, когда он достиг строки 484 в "window.c"
if( wndconfig.glProfile &&
( wndconfig.glMajor < 3 || ( wndconfig.glMajor == 3 && wndconfig.glMinor < 2 ) ) )
{
// Context profiles are only defined for OpenGL version 3.2 and above
return GL_FALSE;
}
теперь я не уверен, почему с использованием статической ссылки glfw думает, что я не на OpenGL 3.2 и выше, хотя с установленной libglfw2 она работает просто отлично?
Спасибо за помощь ребята! особенно datenwolf!
РЕДАКТИРОВАТЬ 3 Спасибо за помощь, ребята. После некоторой помощи от людей в stackru и старом наборе мне удается записать, что нужно сделать для статически связанных GLFW и GLEW, и поместить их на http://www.phacks.net/static-compile-glfw-and-glew/
2 ответа
Итак, ваша ошибка в том, что вызов glfwOpenWindow
не удалось? нет unresolved symbol
или же shared object not found
сообщения даже раньше main()
вызывается? Тогда вы успешно связались с GLFW статически.
Я думаю, что ваша проблема заключается в параметрах, которые вы передаете glfwOpenWindow
:
glfwOpenWindow( 1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW )
Таким образом, вы запрашиваете ноль красных, зеленых или синих бит на канал, но 32 глубинных бита. Я сомневаюсь, что ваша система поддерживает это. Я бы попробовал
glfwOpenWindow( 1024, 768, 8,8,8,0, 24, 8, GLFW_WINDOW )
это то, что большинство систем поддерживают хорошо.
Ваша программа-пример запрашивает OpenGL 3.1 и контекстный профиль. Профили определены только для OpenGL 3.2 и выше, поэтому наиболее вероятно, почему glfwOpenWindow
терпит неудачу в этом случае. Чтобы это исправить, либо запросите версию выше или равную 3.2, либо удалите запрос для профиля контекста.
Для получения дополнительной информации о создании современного контекста OpenGL с помощью GLX, для которого эта часть GLFW является тонким слоем, см. http://www.opengl.org/registry/specs/ARB/glx_create_context.txt.