问题
编译我的项目时,log4cpp文件出现错误。错误如下:
/usr/include/log4cpp/Priority.hh:49:2: erreur: #error Naming collision for 'DEBUG' detected. Please read the FAQ for a workaround.
文件
此错误引用的文件是随 Log4cpp 安装的标头。这里是。错误位于第 49、78 和 109 行
/*
* Priority.hh
*
* Copyright 2000, LifeLine Networks BV (www.lifeline.nl). All rights reserved.
* Copyright 2000, Bastiaan Bakker. All rights reserved.
*
* See the COPYING file for the terms of usage and distribution.
*/
#ifndef _LOG4CPP_PRIORITY_HH
#define _LOG4CPP_PRIORITY_HH
#include <log4cpp/Portability.hh>
#include <string>
#include <stdexcept>
/*
* Optionally work around rudeness in windows.h on Win32.
*/
#ifdef ERROR
#ifdef LOG4CPP_FIX_ERROR_COLLISION
namespace log4cpp {
static const int _tmpERRORValue = ERROR;
}
#undef ERROR
static const int ERROR = log4cpp::_tmpERRORValue;
#define ERROR ERROR
#else // LOG4CPP_FIX_ERROR_COLLISION
#error Naming collision for 'ERROR' detected. Please read the FAQ for a \
workaround.
#endif // LOG4CPP_FIX_ERROR_COLLISION
#endif // ERROR
/*
* Other Win32 rudeness in EDK.h
*/
#ifdef DEBUG
#ifdef LOG4CPP_FIX_ERROR_COLLISION
#undef DEBUG
#define DEBUG DEBUG
#else // LOG4CPP_FIX_ERROR_COLLISION
#error Naming collision for 'DEBUG' detected. Please read the FAQ for a \
workaround.
#endif // LOG4CPP_FIX_ERROR_COLLISION
#endif // DEBUG
namespace log4cpp {
/**
* The Priority class provides importance levels with which one
* can categorize log messages.
**/
class LOG4CPP_EXPORT Priority {
public:
static const int MESSAGE_SIZE; // = 8;
/**
* Predefined Levels of Priorities. These correspond to the
* priority levels used by syslog(3).
**/
typedef enum {EMERG = 0,
FATAL = 0,
ALERT = 100,
CRIT = 200,
ERROR = 300,
WARN = 400,
NOTICE = 500,
INFO = 600,
DEBUG = 700,
NOTSET = 800
} PriorityLevel;
/**
* The type of Priority Values
**/
typedef int Value;
/**
* Returns the name of the given priority value.
* Currently, if the value is not one of the PriorityLevel values,
* the method returns the name of the largest priority smaller
* the given value.
* @param priority the numeric value of the priority.
* @returns a string representing the name of the priority.
**/
static const std::string& getPriorityName(int priority) throw();
/**
* Returns the value of the given priority name.
* This can be either one of EMERG ... NOTSET or a
* decimal string representation of the value, e.g. '700' for DEBUG.
* @param priorityName the string containing the the of the priority
* @return the value corresponding with the priority name
* @throw std::invalid_argument if the priorityName does not
* correspond with a known Priority name or a number
**/
static Value getPriorityValue(const std::string& priorityName)
throw(std::invalid_argument);
};
}
#endif // _LOG4CPP_PRIORITY_HH
研究
我发现唯一引用此问题的常见问题解答是在log4cpp 的 Sourceforge 上。这是它所说的:
这是由于某些平台的粗鲁造成的,这些平台使用一些生硬的#defines 来破坏命名空间。更准确地说,Win32 API 包括“ERROR”和“DEBUG”的#defines。由于预处理器不知道 C++ 命名范围,这导致在任何地方都保留单词 ERROR 和 DEBUG 。特别是这与 log4cpp::Prioritiy::ERROR 和 log4cpp::Priority::DEBUG 冲突。后两个名称来自 log4j,所以它们不是我们自己编造的。他们的 Win32 作者不应该通过预处理器粗暴地声称这些通用名称。还有更好的选择:
If they use it as an integer constant, declare it using a language construct. Either 'enum {ERROR=1};' or 'static const int ERROR=1;'
会做得很好。使用 WIN32API_ERROR 等不太通用的名称来减少命名冲突的可能性 如果他们将其用作条件编译的标志,请使用“#define DEBUG DEBUG”和“#if defined(DEBUG)”。在这种情况下,预处理器将简单地将源代码中所有出现的“DEBUG”替换为“DEBUG”,实际上使所有内容保持不变。
当然,正确的解决方案是如果违规方使用上述方法之一,但我们可能需要等待一段时间才能真正发生。作为替代 log4cpp 可以解决这些#defines。通过在#include 任何 log4cpp 头文件之前和 #include 所有平台头文件之后执行 #define LOG4CPP_FIX_ERROR_COLLISION 1 来启用解决方法代码。对于 Win32 平台,此#define 已包含在 log4cpp/config-win32.h 中。
一旦 log4cpp 更新到 log4j 1.2 API,我们可以通过采用新的日志级别名称来解决这个问题。
语境
问题是,我不应该更改源代码。我只能修改编译配置文件(本项目使用 Apache Ant builder、build.xml
文件和 bash 脚本)。
我对这个项目很陌生,我不能向以前的开发人员寻求帮助。
问题
有没有人遇到过这个错误?除了更改源代码及其定义之外,还有其他可能的解决方法吗?我的环境变量是原因吗?
我将继续我的搜索,但任何见解都会很有用。谢谢 !