GLSDK 打破了easylogging++

Posted

技术标签:

【中文标题】GLSDK 打破了easylogging++【英文标题】:GLSDK breaks easylogging++ 【发布时间】:2013-08-21 22:37:32 【问题描述】:

我正在启动一个 OpenGL 引擎,使用 SFML 作为上下文和输入管理器,使用 GLSDK 来加载 OpenGL(以及现在不重要的图像和东西),并使用 Boost 来处理其他一些事情。

我一直在思考“日志记录”的想法,并尝试了 Boost.Log(未能编译示例,并且对问题的唯一引用未解决)、Log4CPP(在启动时出现错误),最后一切似乎很适合easylogging++,它是一个只有头文件的库(太棒了!),它有一些简洁的语法IMO。

但是编译的时候会报一堆错误:

C2664: 'el::base::utils::DateTime::gettimeofday' : 无法将参数 1 从 'int *' 转换为 'el::base::utils::timeval *'

C2228:“.tv_usec”左侧必须有类/结构/联合

C2227:“->tv_usec”左侧必须指向类/结构/联合/通用类型 C2079:“currTime”使用未定义的结构“el::base::utils::timeval” C2027:使用未定义类型 'el::base::utils::timeval' 还有更多

我是这样实现的:

'helpers.Log.hpp':pragma once,包括 'easylogging++.h' 并定义命名空间助手 > 命名空间日志 > void function init()。

'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)

编译命令: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 _WINDOWS /D _DEBUG / D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /GR /Fo"KINGDOMS_0_1.dir\Debug\" /Fd "F:/BTSync/prog_projs/KINGDOMS/trunk/pro/Debug/KINGDOMS_0_1_d.pdb" /Gd /TP /analyze- /errorReport:prompt ..\src\engine.Boot.cpp ..\src\engine.Core. cpp ..\src\engine.Interfaces.cpp ..\src\helpers.Log.cpp ..\src\main.cpp

发布前编辑:好的,看起来 'glload/gl_3_3.hpp' 是这里的问题。它设法打破了easylogging++。那已经超过了我。这怎么可能呢?我能做什么?

编辑以添加真实代码

engine.Core.hpp

#pragma once

#include <glload/gl_load.hpp>
#include <glload/gl_4_4.hpp>

#include <helpers.Log.hpp>

namespace engine

    class Core
    
    public:
        Core();
        ~Core();
    ;

engine.Core.cpp

#include <engine.Core.hpp>

engine::Core::Core()

    helpers::log::init();


engine::Core::~Core()


helpers.Log.hpp

#pragma once

#include <easylogging++.h>

namespace helpers

    namespace log
    
        void init();
    

helpers.Log.cpp

#include <helpers.Log.hpp>

_INITIALIZE_EASYLOGGINGPP

void helpers::log::init()

    el::Configurations conf("../log_config.cfg");
    el::Loggers::reconfigureLogger("default", conf);
    el::Loggers::reconfigureAllLoggers(conf);

【问题讨论】:

您能给我们展示一个重现您的错误的最小代码示例吗? 完成。这是我现在使用的文字代码。删除“glload/gl_3_3.hpp”的包含可解决编译错误。感谢您的关注。 当然,我还是需要包含glload/gl_3_3.hpp,还有logger接口!所以不能把它作为解决方案。包含任何其他版本的 OpenGL 都会导致 easylogging++ 失败。 好像和跨平台日期时间功能有冲突。您使用的是什么编译器和操作系统?你能发送编译命令吗? 我已在主要问题中添加了信息。感谢您的关注! 【参考方案1】:

我通过添加修复它

#include <Winsock2.h>

紧接着:

#elif _ELPP_OS_WINDOWS
#   include <direct.h>
#   include <Windows.h>

在easylogging++.h中

它包含 timeval 结构的定义。看来他们忘记了。

【讨论】:

是的,这对我不起作用,它只会产生超过 500 个错误。我真的很困惑为什么标题守卫在这里没有做他们的工作,但我真的厌倦了easylogging++的唯一问题,即使它不一定是它的错。

以上是关于GLSDK 打破了easylogging++的主要内容,如果未能解决你的问题,请参考以下文章

easylogging++:在应用程序启动时清除日志文件

easylogging++ 如何避免多次初始化

cmake:下载easylogging++,直接使用源码

easylogging++学习记录:流式日志

是否可以通过与 easylogging++ 相同的方式链接重载插入运算符来创建一个模仿 std::cout 语法的 C++ 类?

easylog -- Linux 下的简单日志库