我正在尝试将libbz2库与ROOT框架一起使用,但我没有取得任何成功。 我使用libbz2编写了没有ROOT的测试应用程序,它运行正常。这是我的代码:
#ifndef BZlib_H
#define BZlib_H
#include <bzlib.h>
#include <iostream>
class BZlib : public std::streambuf, virtual public std::istream
{
BZFILE * fbz2File;
...
}
他是我的makefile:
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
bzlib.h中的第275行包含以下代码:
#ifdef __cplusplus
}
#endif
是
的结束括号#ifdef __cplusplus
extern "C" {
#endif
我该如何解决这个问题?
答案 0 :(得分:0)
Oook,问题是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"