Статическая компиляция 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.

Другие вопросы по тегам