Проблемы с ROOT и libbz2

Я пытаюсь использовать библиотеку libbz2 с каркасом ROOT, но не добился успеха.
Я написал тестовое приложение без ROOT, используя libbz2, и оно отлично работает. Вот мой код:

#ifndef BZlib_H
#define BZlib_H

#include <bzlib.h>
#include <iostream>

class BZlib : public std::streambuf, virtual public std::istream
{
BZFILE * fbz2File;
...
}

Он мой make-файл:

CC=g++
TARGET=bzip_happiness
HEADERS=$(wildcard *.h)
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)

# Flags
CXXFLAGS = -c -g

all: $(TARGET)

$(OBJECTS): $(HEADERS)

.cpp.o:
$(CC) -Wall $(CXXFLAGS) $< -o $@

$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS) -L. -lbz2 -Wl,-rpath,.

clean:
rm -f $(TARGET) $(OBJECTS)

.PHONY: all clean

Когда я пытаюсь использовать этот код с платформой ROOT, компиляция завершается со следующим сообщением:

>  - Generating dictionary BBaseCint.cc
rootcint -f BBaseCint.cc \
-c -I. -I../mfileio -I../mfbase -I../mastro -I../MBase -I../mbase -I../mgui -DMARSVER=\"2.4\" -D__MARS__   BZlib.h  BBaseIncl.h BBaseLinkDef.h
Error: Too many '}' /usr/include/bzlib.h:275:
make: *** [BBaseCint.cc] Segmentation fault
make: *** Deleting file `BBaseCint.cc'

Весь мой код такой же, кроме заголовков:

#ifndef BZlib_H
#define BZlib_H

#ifndef ROOT_TObject
#include <TObject.h>
#endif

#include <bzlib.h>
#include <iostream>

class BZlib : public std::streambuf, virtual public std::istream, public TObject
{
private:
BZFILE * fbz2File;
...
ClassDef(BZlib, 0)
};
#endif

Строка 275 в bzlib.h содержит следующий код:

#ifdef __cplusplus
}
#endif

которая является закрывающей скобкой для

#ifdef __cplusplus
extern "C" {
#endif

Как я могу решить проблему?

1

Решение

Оу, проблема в том, что rootcint не может интерпретировать extern "C",

Решение состоит в том, чтобы заменить следующий код в bzlib.h

#ifndef BZ_IMPORT
#define BZ_EXPORT
#endif

#ifndef BZ_NO_STDIO
/* Need a definitition for FILE */
#include <stdio.h>
#endif

#ifdef _WIN32
#   include <windows.h>
#   ifdef small
/* windows.h define small to char */
#      undef small
#   endif
#   ifdef BZ_EXPORT
#   define BZ_API(func) WINAPI func
#   define BZ_EXTERN extern
#   else
/* import windows dll dynamically */
#   define BZ_API(func) (WINAPI * func)
#   define BZ_EXTERN
#   endif
#else
#   define BZ_API(func) func
#   define BZ_EXTERN extern
#endif

с

#ifndef BZ_NO_STDIO
/* Need a definitition for FILE */
#include <cstdio>
#endif#define BZ_EXTERN extern "C"
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]