我一直致力于一个跨平台窗口库,旨在专门用于OpenGL,目前专注于Linux.我正在利用glload来管理OpenGL扩展,并且正在编译它,以及我稍后将使用的其他库.so.这个`.so正在按照您的预期动态加载,但在运行时程序提供以下输出(手动包装,以便更容易阅读):
_dist/x64-linux-debug/bin/test: Symbol `glXCreateContextAttribsARB' has \
different size in shared object, consider re-linking
现在,显然我已经尝试重新连接,甚至多次重建整个项目(测试出来的东西,而不是盲目地希望它会神奇地使它变得更好).该程序似乎确实愿意运行,因为它会产生一些日志输出,正如我所期望的那样.我曾经nm确认过'符号'在.so
nm _dist/x64-linux-debug/lib64/libvendor.so | grep glXCreateContextAttribsARB
00000000009e0e78 B glXCreateContextAttribsARB
如果我readelf用来查看正在定义的符号,我得到以下内容(同样,为了格式化,我手动包装了前三行):
readelf -Ws _dist/x64-linux-debug/bin/test \
_dist/x64-linux-debug/lib64/libvendor.so | \
grep glXCreateContextAttribsARB
   348: 000000000062b318  8 OBJECT  GLOBAL DEFAULT  26 glXCreateContextAttribsARB
   421: 000000000062b318  8 OBJECT  GLOBAL DEFAULT  26 glXCreateContextAttribsARB
  1370: 00000000009e0e78  8 OBJECT  GLOBAL DEFAULT  25 glXCreateContextAttribsARB
 17464: 00000000009e0e78  8 OBJECT  GLOBAL DEFAULT  25 glXCreateContextAttribsARB
我担心这是我能提供的所有帮助,因为我真的不知道该尝试或研究什么.就像我说的那样,我相信会有更多的信息需要,所以请说一下我会尽我所能.我从我的项目根运行这些命令,包括你想知道.
我正在启动一个OpenGL引擎,使用SFML作为上下文和输入管理器,使用GLSDK加载OpenGL(以及现在不重要的图像和事物)和Boost用于其他一些事情.
我一直想知道"日志记录"的想法,并尝试了Boost.Log(未能编译示例,并且唯一的问题参考未解决),Log4CPP(在启动时出错)最后一切似乎都是使用easylogging ++很好,是一个只有标题的库(horray!),它有一些巧妙的语法IMO.
但是在编译时会出现一堆错误:
C2664:'el :: base :: utils :: DateTime :: gettimeofday':无法将参数1从'int*'转换为'el :: base :: utils :: timeval*'
C2228:'.tv_usec'的左边必须有class/struct/union
我用这种方式实现了它:
'helpers.Log.cpp':'_ INITIALIZE_EASYLOGGINGPP'并实现init(),如下所示:
el::Configurations conf("../log_config.cfg");
el::Loggers::reconfigureLogger("default", conf);
el::Loggers::reconfigureAllLoggers(conf);
现在,只有这两个文件处理日志记录.'engine.Core.hpp'包括'helpers.Log.hpp','engine.Boot.hpp'(现在空白),'glload/gl_load.hpp','glload/gl_3_3.hpp'以及在'的构造函数中核心类,在引擎名称空间内,调用init()函数.
整个应用程序中没有其他任何操作.就是这样,日志系统的初始化,但它完全失败了.
系统信息
操作系统:Windows 7 x64
IDE:Visual Studio 2012
编译器: VS2012(v110)
COMPILE COMMAND:cl/c/IF:/ BTSync/prog_projs/KINGDOMS/trunk/inc/IF:/ dev/SFML/21/include/IF:/ dev/GLSDK/052/glload/include/IF:/ dev/GLSDK/052/glutil/include/IF:/ dev/GLSDK/052/glm/IF:/ dev/GLSDK/052/glmesh/include/IF:/ dev/GLSDK/052/glimage/include/IF:/ dev/BOOST/154/IF:/ DEV/LIBROCKET/121_3/include/Zi/nologo-/W3/WX-/Od/Ob0/Oy-/D WIN32/D …
我使用ARB_DEBUG_OUTPUT扩展来捕获OpenGL错误,但程序在调用我的错误记录功能后崩溃.
我使用此博客文章中的代码设置了扩展程序.这是我用来设置回调的确切代码:
glDebugMessageCallback((GLDEBUGPROC)debugCallbackARB, stderr);
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
这里的 debugCallbackARB
void debugCallbackARB(GLenum source, GLenum type, GLuint id, GLenum severity,
                     GLsizei length, const GLchar *message, GLvoid *userParam)
{
    (void)length;
    FILE *outFile = (FILE*)userParam;
    char finalMessage[256];
    formatDebugOutputARB(finalMessage, 256, source, type, id, severity, message);
    logger->debug("%s", finalMessage);
}
我使用glEnable无效参数来触发回调:
glEnable(GL_DEPTH);
成功打印错误消息后,程序会触发未处理的异常 Access violation executing location 0x00000500.
我使用SDL2创建OpenGL 3.3核心配置文件调试上下文和GL Load来获取GL扩展指针.
glEnable如果禁用扩展,程序不会因无效调用而崩溃.
我怎样才能解决这个问题?
电脑规格:
编辑:我也尝试手动调用调试回调,但它不会触发异常.