linux - 静态编译glfw

标签 linux opengl gcc glfw

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

在我的项目目录中,我得到了包含 glfw 2.7.1 源代码的“external/glfw”。我通过运行“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。

有人能帮帮我吗?谢谢你们的宝贵时间!

干杯!

P

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

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

使用 gdb 显示我的代码进入 glfwOpenWindow(),它位于 glfw 源代码的“window.c”中。因为我是 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 却工作正常?

感谢您的帮助!特别是 datenwolf!

EDIT 3 感谢大家的帮助。在得到 stackoverflow 和老 nabble 的一些帮助后,我设法写下静态链接 GLFW 和 GLEW 需要做的事情,并将其放在 http://www.phacks.net/static-compile-glfw-and-glew/ 上。

最佳答案

那么您的错误是对 glfwOpenWindow 的调用失败了?在 main() 被调用之前,没有 unresolved symbolshared object not found 消息?然后你成功地静态链接到 GLFW。

我认为你的问题在于你传递给glfwOpenWindow的参数:

glfwOpenWindow( 1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW )

因此,您要求每个 channel 的红色、绿色或蓝色位为零,但深度位为 32。我怀疑你的系统支持那个。我会尝试

glfwOpenWindow( 1024, 768, 8,8,8,0, 24, 8, GLFW_WINDOW )

大多数系统都很好地支持这一点。

关于linux - 静态编译glfw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7139086/

相关文章:

linux - 软件需要当前安装的软件包的旧版本

linux - 查找命令中的反斜杠

java - Java Swing 中不稳定的框架和窗口?

windows - 为什么 GCC-Windows 依赖于 cygwin?

gcc - C++ 共享库符号版本控制

c - 无限循环不起作用,用gcc编译

linux - Linux命令行中killall的进程名在哪里

c++ - C/C++ 中 OpenGL 着色器的简单框架

c++ - SDL_GL_SetAttribute 不设置颜色大小

C++ GLSL 着色器 : "error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES" or black window