静态编译glfw

时间:2011-08-21 15:09:21

标签: linux opengl gcc glfw

我正在尝试使用GCC 4.4.3在Linux Mint(基于Ubuntu 10.04)上将glfw编译为静态链接。

在我的项目目录中,我得到了“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编译为静态链接,并使用带有flags的gcc编译代码:

/usr/bin/gcc `pkg-config --cflags libglfw` -o test test.c \
`pkg-config --libs libglfw` -lXrandr -lX11 -lGLU -lGL -pthread -lm

它并没有给我任何错误。但是当我尝试执行二进制文件时,它表明我没有调用glfwOpenWindow。

任何人都可以帮助我吗?谢谢你们的时间!

喝彩!

P

编辑1 :我认为问题在于链接过程而不是代码。因为如果我安装了libglfw2和libglfw-dev(ubuntu包),那么可执行文件运行就好了。我想要的是让glfw静态链接,而不是依赖于发行版包共享库来运行二进制文件。

编辑2 根据datenwolf建议我尝试使用gdb进行调试。我从来没有使用过gdb,但我经常使用perl调试器。不知怎的,他们有很多相似之处。我用-ggdb重新编译glfw和我的test.c。

与gdb一起流动它表明我的代码进入glfw源代码中的“window.c”中的glfwOpenWindow()。因为我是gdb的新手,我不知道如何评估表达式或获取变量的值。基于快速搜索谷歌所有我知道是“whatis”看日期类型。但我认为我的代码在“window.c”中到达第484行时停止了

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它可以正常工作吗?

感谢你的帮助!尤其是约会狼!

编辑3 感谢帮助人员。在stackoverflow和old nabble中的人们提供了一些帮助后,我设法将它写下来静态链接GLFW和GLEW并将其放在http://www.phacks.net/static-compile-glfw-and-glew/

2 个答案:

答案 0 :(得分:2)

所以你的错误是对glfwOpenWindow的调用失败了吗?甚至在unresolved symbol被调用之前都没有shared object not foundmain()条消息?然后,您成功地静态链接了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 )

这是大多数系统支持的。

答案 1 :(得分:0)

您的示例程序请求OpenGL 3.1 上下文配置文件。仅为OpenGL 3.2及更高版本定义了配置文件,这很可能是glfwOpenWindow在这种情况下失败的原因。要解决此问题,请先申请高于或等于3.2的版本,或删除上下文配置文件的请求。

有关使用GLX创建现代OpenGL上下文的更多信息,GLFW的这一部分是薄层,请参阅 http://www.opengl.org/registry/specs/ARB/glx_create_context.txt