Компиляция программы 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

Другие вопросы по тегам