gcc标志的makefile问题(文件无法识别;共享库)

时间:2011-06-06 16:59:10

标签: gcc makefile shared-libraries

我现在有点困惑。我正在尝试让Makefile工作,但它会中断。我希望有人可以帮助我解决这个糟糕而令人沮丧的时间杀手。

我编写了一个编译器的小巧轻量级部分。

  

该项目具有以下结构:

     

/Compiler.cpp
  / Makefile中
  /缓冲器/
  /缓冲器/ Makefile文件
  /扫描仪/
  /扫描仪/生成文件
  / SymTable /
  / SymTable / Makefile

当我编译Buffer,Scanner和SymTable手册时(更改目录并输入'make mode = release',没问题,每个共享库都已编译)。但是当我从“Master Makefile”/ Makefile所在的位置运行Makefile时,它会失败并且终端会输出如下内容:

Buffer/libBuffer.so: file not recognized: File format not recognized  
collect2: ld returned 1 exit status  
make: \*** [Compiler] Error 1

以下是/ Buffer / Makefile的Makefile列表(Scanner和SymTable的相同):

CXX = g++

ifeq ($(mode),release)
  CXXFLAGS = -g -fPIC -O3 -ffunction-sections -march=native
else
  mode = debug
  CXXFLAGS = -g3
endif

MODUL = Buffer
COMPONENTS = Buffer.h
MK_LIBRARY = lib$(MODUL).so

all: $(MK_LIBRARY)

$(MK_LIBRARY): $(COMPONENTS)
  $(CXX) $(CXXFLAGS) -shared -o $@ $^

clean:
  rm -f $(MK_LIBRARY)

.PHONY: all
.PHONY: clean

'Master Makefile'如下所示:     CXX = g ++

ifeq ($(mode),release)
  CXXFLAGS = -g -O3 -ffunction-sections -fwhole-program -march=native
else
  mode = debug
  CXXFLAGS = -g3
endif

TARGET = Compiler

COMPONENTS = $(TARGET)

DIRS = Buffer Scanner SymTable
MAKE = make
MFLAGS = mode=$(mode)

all: $(COMPONENTS)

$(TARGET): Compiler.cpp libBuffer.so libScanner.so libSymTable.so
  $(CXX) $(CXXFLAGS) -IBuffer -IScanner -ISymTable \  
  -LBuffer -LScanner -LSymTable \  
  -lBuffer -lScanner -lSymTable -o $@ Compiler.cpp

libBuffer.so: force_look
  cd Buffer; $(MAKE) $(MFLAGS)

libScanner.so: force_look
  cd Scanner; $(MAKE) $(MFLAGS)

libSymTable.so: force_look
  cd SymTable; $(MAKE) $(MFLAGS)

clean:
  rm -f $(COMPONENTS)
  @for d in $(DIRS); do (cd $$d; $(MAKE) clean ); done

check:
  @for d in $(DIRS); do (cd $$d; $(MAKE) check ); done

force_look:
  true

.PHONY: all
.PHONY: clean
.PHONY: check

我希望有人能给我一个答案!谢谢!

1 个答案:

答案 0 :(得分:0)

这部分有点奇怪:

MODUL = Buffer
COMPONENTS = Buffer.h
MK_LIBRARY = lib$(MODUL).so

$(MK_LIBRARY): $(COMPONENTS)
  $(CXX) $(CXXFLAGS) -shared -o $@ $^

此规则尝试使用头文件 libBuffer.so 构建Buffer.h。如果没有Buffer.cc中对事物的定义,这怎么可能有效呢?我会这样做:

lib%.so: %.o
    $(CXX) $(CXXFLAGS) -shared -o $@ $^

修改:
您在Buffer.h中有Buffer的定义吗?好吧,你有不止一个问题,解决它们的唯一方法就是做几乎总是有效的事情:退回到一个更简单的问题并首先解决它。你可以Buffer.o吗?然后,您可以将其链接到您的可执行文件(绕过libBuffer.so)吗?如果没有,你能在Buffer/中写一个“HelloWorld”,并将Buffer.o链接到那个吗?