Компиляция программы xerces-C++ с Eclipse
Я пытаюсь программировать с Xerces-C на окнах.
Я успешно собрал библиотеку и с успехом скомпилировал простую программу, barebone, просто с cmd и блокнотом. Однако, когда я попытался заставить вещи затмить, вещи немного вышли из-под контроля.
Просто имея пример helloworld на C++, а затем включая включаемые файлы в путь и сборку проекта, 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 { }
пространство имен xercesc = XERCES_CPP_NAMESPACE;
Но я не знаю, как научить сборщика это делать, и я не уверен, правильно ли я скомпилировал библиотеку.
Может кто-то указать мне в каком-то направлении, как решить эту проблему? Я могу скомпилировать простую программу, просто используя cmd, поэтому, безусловно, я смогу сделать это в Eclipse.
фон:
- ОС: Windows 8 64bit
- компилятор: mingw-w64 5.3.0 posix-seh-rev0
- lib скомпилирован с msys
- Команда компиляции lib:
- ./configure --prefix = / specific-location --host = x86_64-w64-mingw32 --enable-netaccessor-winsock --enable-transcoder-windows --disable-pretty-make
- make LDFLAGS = -no-undefined
- сделать проверку
- сделать установку
Команда компиляции cmd: g++ -Llib -Iinclude -o b.exe test.cpp
так что вы можете видеть, что я также включил каждый заголовок xerces-c в компилятор с помощью команды -Iinclude, поэтому я считаю, что g ++ не должен вызывать ошибку при вызове в Eclipse, а не то, что я знаю что-либо, если это gcc.
простая программа, которая запускается при простой компиляции с помощью 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;
}
@РЕДАКТИРОВАТЬ
После дальнейшего исследования кажется, что 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)
<===== WRONGWRONG, так как XERCES_TMPLSINC фактически никогда не определялся.
Согласно некоторым сообщениям на форуме, XERCES_TMPLSINC требовался для некоторых старых компиляторов c, так кто-нибудь знает, как это исправить в моей сборке? Как я могу определить XERCES_TMPLSINC в проекте? Я пробовал добавлять #define XERCES_TMPLSINC
в файл helloworld, но он все еще не работает.
@РЕДАКТИРОВАТЬ
мой плохой, на самом деле все.c файлы содержали #if defined(XERCES_TMPLSINC)
и все файлы hpp были #if !defined(XERCES_TMPLSINC)
, это определенно кажется AC и C++ вещь?
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