【问题标题】:Makefile without specifying the source fileMakefile 不指定源文件
【发布时间】:2014-10-07 12:29:32
【问题描述】:

我有一个makefile如下:

# Makefile for VocabLearn

MACHTYPE=$(shell uname -m)

GCC         = g++

CC=gcc
# OPTFLAGS=-g2
OPTFLAGS=-O3 -ffast-math -Wall -mfpmath=sse -msse2 -funroll-loops -march=core2
OTHERFLAGS=-Wall -fopenmp

INCLUDE_PATH=-I../lib/ann_1.1/include/ANN -I../lib/ann_1.1_char/include/ANN \
    -I../lib/imagelib -I../VocabLib -I../lib/zlib/include
LIB_PATH=-L../lib -L../VocabLib -L../lib/zlib/lib

OBJS=VocabLearn.o

LIBS=-lvocab -lANN -lANN_char -limage -lz

CPPFLAGS=$(INCLUDE_PATH) $(LIB_PATH) $(OTHERFLAGS) $(OPTFLAGS)

BIN=VocabLearn

all: $(BIN)

$(BIN): $(OBJS)
    g++ -o $(CPPFLAGS) -o $(BIN) $(OBJS) $(LIBS)

clean:
    rm -f *.o *~ $(LIB)

当我在提示符中“制作”它时,它工作正常并输出以下信息:(我使用 Mac OS,c++ 表示 clang 编译器)

c++ -I../lib/ann_1.1/include/ANN -I../lib/ann_1.1_char/include/ANN -I../lib/imagelib -I../VocabLib -I../lib/zlib/include -L../lib -L../VocabLib -L../lib/zlib/lib -Wall -fopenmp -O3 -ffast-math -Wall -mfpmath=sse -msse2 -funroll-loops -march=core2 -c -o VocabLearn.o VocabLearn.cpp

g++ -o -I../lib/ann_1.1/include/ANN -I../lib/ann_1.1_char/include/ANN -I../lib/imagelib -I../VocabLib -I../lib/zlib/include -L../lib -L../VocabLib -L../lib/zlib/lib -Wall -fopenmp -O3 -ffast-math -Wall -mfpmath=sse -msse2 -funroll-loops -march=core2 -o VocabLearn VocabLearn.o -lvocab -lANN -lANN_char -limage -lz

我只是想知道这个 makefile 是如何工作的。如您所见,由于这个 makefile 没有指定要编译的源代码,编译器如何知道它应该处理的是“VocabLearn.cpp”? (我的猜测是它会根据目标文件的名称 VocabLearn.o 搜索源文件)而且这行对我来说似乎有点奇怪:

g++ -o $(CPPFLAGS) -o $(BIN) $(OBJS) $(LIBS)

为什么在“$(CPPFLAGS)”之前有一个“-o”?

【问题讨论】:

  • 那行很奇怪......而且很可能是错误的。 -o 很可能会吞下 $(CPPFLAGS) 中的第一个参数,除非 g++ 参数解析非常聪明。
  • @EtanReisner:确实错了;但无害,因为它只会吞下第一个包含目录,而链接不需要该目录。
  • @MikeSeymour:但它不会吞下第一个目录,正如您从输出中看到的那样。
  • @NothingMore:还在命令行中;但作为第一个(错误的)-o 的参数,因此它失去了意义并且没有指定包含目录。然后被第二个-o 覆盖。

标签: c++ makefile


【解决方案1】:

这个makefile 使用implicit rules 来编译源文件。规则:

$(BIN): $(OBJS)

询问OBJS 中的目标文件,如果有VocabLean.cpp 文件,make 已经知道如何构建VocabLearn.o

【讨论】:

  • 那么隐式规则也可以包含需要的目录和链接需要的.obj文件吧?
  • @NothingMore:是的,编译 C++ 的隐含规则将在编译器标志中包含 $(CPPFLAGS)
【解决方案2】:

基本上有一个将 *.cpp 文件转换为 *.o 文件的隐式规则,但是您必须将 *.o 作为目标中的一个依赖项。在给定的 Makefile 中,您将 VocabLearn.o 作为 $(BIN) 的依赖项。因此,VocabLearn.o 是从 VocabLearn.cpp 文件自动生成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2018-12-22
    • 1970-01-01
    相关资源
    最近更新 更多