我正尝试在Windows上使用xerces-c进行编程。
我已成功构建了库并编译了一个简单的程序,成功,准系统,只有cmd和记事本。然而,当我试图将事情转移到日食时,事情变得有些失控。
通过简单地使用c ++ helloworld示例,然后将include文件包含到项目路径和构建中,eclipse拒绝构建项目,产生大量错误,我认为这些错误主要与命名空间有关。
错误如下:
Info: Internal Builder is used for build
g++ -I...blablabla -O3 -Wall -c -fmessage-length=0 -o "src\\helloworld.o" "..\\src\\helloworld.cpp"
gcc -O3 -Wall -c -fmessage-length=0 -o "src\\includes\\xercesc\\util\\RefStackOf.o" "..\\src\\includes\\xercesc\\util\\RefStackOf.c"
..\src\includes\xercesc\util\RefStackOf.c:30:1: error: unknown type name 'XERCES_CPP_NAMESPACE_BEGIN'
XERCES_CPP_NAMESPACE_BEGIN
..\src\includes\xercesc\util\RefStackOf.c:35:10: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
template <class TElem>
^
..\src\includes\xercesc\util\RefStackOf.c:44:10: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
template <class TElem> RefStackOf<TElem>::~RefStackOf()
..\src\includes\xercesc\util\RefStackOf.c:...
...this and that, this and that.... and finally...
..\src\includes\xercesc\util\RefStackOf.c:160:1: error: expected '=', ',', ';', 'asm' or '__attribute__' at end of input
XERCES_CPP_NAMESPACE_END
如果我错误地删除了该文件,则错误将弹出到具有相同格式的另一个文件,以“我不知道XERCES_CPP_NAMESPACE_BEGIN的含义”开头
我也试过使用另一个构建器,比如mingw32-make,但它也会以相同的格式生成错误。只更改标题,并且可能以不同的顺序编译文件,从这开始:
mingw32-make all
'Building file: ../src/includes/xercesc/util/BaseRefVectorOf.c'
'Invoking: GCC C Compiler'
gcc -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/includes/xercesc/util/BaseRefVectorOf.d" -MT"src/includes/xercesc/util/BaseRefVectorOf.o" -o "src/includes/xercesc/util/BaseRefVectorOf.o" "../src/includes/xercesc/util/BaseRefVectorOf.c"
../src/includes/xercesc/util/BaseRefVectorOf.c:24:1: error: unknown type name 'XERCES_CPP_NAMESPACE_BEGIN'
XERCES_CPP_NAMESPACE_BEGIN
我猜测构建程序不了解如何替换
XERCES_CPP_NAMESPACE_BEGIN,
命名空间XERCES_CPP_NAMESPACE {}
namespace xercesc = XERCES_CPP_NAMESPACE;
但是我不知道如何教会构建器如何执行此操作,也不知道我是否以正确的方式编译了库。
有人能指出我如何解决这个问题吗?我可以通过使用cmd编译一个简单的程序,所以当然我应该能够在Eclipse中完成它。
背景:
cmd编译命令:g ++ -Llib -Iinclude -o b.exe test.cpp
所以你可以看到我还使用-Iinclude命令将每个xerces-c头都包含在编译器中,所以我认为g ++在Eclipse中调用时不应该产生错误,而不是我知道gcc是什么。 / p>
使用cmd编译时运行的简单程序:
//test.cpp
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <iostream>
using namespace std;
using namespace xercesc;
int main (int argc, char* args[]) {
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Error during initialization! :\n"
<< message << "\n";
XMLString::release(&message);
return 1;
}
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); // optional
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
char* xmlFile = "x1.xml";
try {
parser->parse(xmlFile);
DOMDocument* xmlDoc = parser->getDocument();
DOMElement* elementRoot = xmlDoc->getDocumentElement();
if( !elementRoot ) throw(std::runtime_error( "empty XML document" ));
DOMNodeList* children = elementRoot->getChildNodes();
const XMLSize_t nodeCount = children->getLength();
cout << nodeCount << " nodes\n";
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (...) {
cout << "Unexpected Exception \n" ;
return -1;
}
delete parser;
delete errHandler;
return 0;
}
@EDIT
经过进一步调查后,似乎XERCES_CPP_NAMESPACE_BEGIN在预处理器中处理,但它只在文件util/XercesDefs.hpp
中定义
在包含编译错误的文件中,它们始终以
开头#if defined(XERCES_TMPLSINC)
#include <xercesc/util/RefStackOf.hpp> //or include anything else blablabla, which ultimately leads to XercesDefs.hpp
#endif
我在整个构建目录中搜索了字符串XERCES_TMPLSINC,它包含在44 .c或.hpp文件中,但是每个文件都是#if !defined(XERCES_TMPLSINC)
&lt; =====错误,所以像XERCES_TMPLSINC一样从未真正定义过。
根据一些forum post,一些旧的c编译器需要XERCES_TMPLSINC,所以有人知道如何在我的构建中解决这个问题吗?我怎么能在项目中定义XERCES_TMPLSINC?我已经尝试将#define XERCES_TMPLSINC
添加到helloworld文件中,但它仍然不起作用。
@EDIT
我的不好,实际上所有的.c文件都包含#if defined(XERCES_TMPLSINC)
而所有的hpp文件都是#if !defined(XERCES_TMPLSINC)
,这看起来肯定是c和c ++的东西?
答案 0 :(得分:1)
我能够在Ecliplse(在Linux上)通过在preprocessor defs
中添加以下g++
来编译它:
-DXERCESC_INCLUDE_GUARD_WEAVEPATH_CPP -DXERCES_HAVE_STDINT_H -DXERCES_TMPLSINC.
在Windows上我认为你应该用
代替 -DXERCES_HAVE_STDINT_H -DXERCES_HAVE_CSTDINT