【问题标题】:Makefile problems with gcc flags (file not recognized; shared libraries)gcc 标志的 Makefile 问题(文件无法识别;共享库)
【发布时间】:2011-06-06 16:59:10
【问题描述】:

我现在有点困惑。我试图让 Makefile 工作,但它坏了。我希望有人可以帮助我解决这个糟糕且令人沮丧的时间杀手。

我已经编写了一个编译器的小而轻的部分。

项目结构如下:

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

当我编译 Buffer、Scanner 和 SymTable 手册时(更改目录并输入“make mode=release”没问题,每个共享库都已编译)。但是,当我从“主 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

“主 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

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

【问题讨论】:

  • 产生该错误的命令行是什么?它应该在错误消息之前立即打印出来,看看它有什么问题应该可以告诉你 makefile 到底有什么问题。还要确保执行make clean 以确保您没有留下损坏的中间文件。明显的错误是 Buffer/libBuffer.so 已损坏/不是有效的共享库。

标签: gcc makefile shared-libraries


【解决方案1】:

这部分有点奇怪:

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

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

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

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

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

【讨论】:

  • 我已经在头文件中写了整个缓冲区...所以这行得通。我会试试你的解决方案......嗯,好的,但你的解决方案对我不起作用:(
猜你喜欢
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多