1

我正在尝试将 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

我该如何解决这个问题?

4

1 回答 1

0

哎呀,问题是 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"
于 2013-08-07T12:25:53.347 回答