我现在有点困惑。我正在尝试让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
我希望有人能给我一个答案!谢谢!
答案 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
链接到那个吗?