【发布时间】: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