статическая компиляция glfw - PullRequest
3 голосов
/ 21 августа 2011

Я пытаюсь скомпилировать glfw как статическую ссылку на Linux Mint (на основе Ubuntu 10.04), используя GCC 4.4.3.

Внутри моего каталога проекта я получил "external / glfw", который содержит исходный код glfw 2.7.1. Я скомпилировал его, запустив «make x11-install», который дает:

  • / USR / местные / включить / GL / glfw.h
  • / USR / местные / Библиотека / libglfw.a
  • / USR / местные / Библиотека / pkg-config / 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.

Может кто-нибудь помочь мне, пожалуйста? спасибо за ваше время, ребята!

ура!

P

EDIT 1 : Я думаю, что проблема заключается в процессе связывания, а не в коде. Потому что, если у меня установлены libglfw2 и libglfw-dev (пакеты ubuntu), то исполняемый файл работает очень хорошо. Здесь я хочу, чтобы glfw был статически связан, а не полагался на либ-пакеты общего доступа к дистрибутиву для запуска двоичного файла.

РЕДАКТИРОВАТЬ 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 Спасибо за помощь, ребята. После некоторой помощи от людей в stackoverflow и старом nabble мне удалось записать, что нужно сделать для статически связанных GLFW и GLEW, и поместить его в http://www.phacks.net/static-compile-glfw-and-glew/

Ответы [ 2 ]

2 голосов
/ 21 августа 2011

Значит, ваша ошибка в том, что звонок на 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 )

Это то, что большинство систем хорошо поддерживают.

0 голосов
/ 07 сентября 2011

Ваш пример программы запрашивает OpenGL 3.1 и профиль контекста. Профили определены только для OpenGL 3.2 и выше, что, скорее всего, приводит к сбою glfwOpenWindow в этом случае. Чтобы это исправить, либо запросите версию выше или равную 3.2, либо удалите запрос для профиля контекста.

Для получения дополнительной информации о создании современного контекста OpenGL с помощью GLX, для которого эта часть GLFW является тонким слоем, см. http://www.opengl.org/registry/specs/ARB/glx_create_context.txt.

...