使用Eclipse

时间:2016-08-26 07:14:56

标签: c++ c eclipse gnu-make xerces-c

我正尝试在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中完成它。

背景:

  • 操作系统:Windows 8 64位
  • 编译器:mingw-w64 5.3.0 posix-seh-rev0
  • 使用msys编译的lib
  • lib编译命令:
  • ./ configure --prefix = / specific-location --host = x86_64-w64-mingw32 --enable-netaccessor-winsock --enable-transcoder-windows --disable-pretty-make
  • 制作LDFLAGS = -no-undefined
  • make check
  • make install

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 ++的东西?

1 个答案:

答案 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