Makefile:使用单个目标

时间:2016-05-17 11:45:31

标签: object makefile

我有几个c ++对象,我想使用单个目标进行编译。如果可能的话,我将在makefile中创建一个列出所有目标文件的变量,然后有一个目标将它们全部编译。

关注this question到目前为止,我有以下“Makefile”:

#### Directories and flags

ifndef $(DIR_MAIN)
  DIR_MAIN=../..
endif

DIR_EXE=$(DIR_MAIN)
DIR_SRC=$(DIR_MAIN)/src/Analyse_MC
DIR_MISC_SRC=$(DIR_MAIN)/src/Misc
DIR_BLD=$(DIR_MAIN)/build/Analyse_MC
DIR_MISC_BLD=$(DIR_MAIN)/build/Misc
COMP=g++

COMPILE_FLAGS= -std=c++11 -O3 -lstdc++ `pkg-config --cflags eigen3` -msse2 -I${DIR_MISC_SRC}
LINK_FLAGS= -O3 -fopenmp -lgsl -lgslcblas -lm -lhdf5_cpp -lhdf5

OBSERVABLE_OBJECTS=g_decomp_IP_orthog_sphere.o g_decomp_LS_orthog_sphere.o g_decomp_IP_disk.o g_decomp_LS_disk.o find_rank.o eigenvectors.o GramSchmidt.o diagonal_Hamiltonian.o mean_log_WF.o energy.o JK_EP_overlap.o overlap.o geo_mean_eigstate_overlap.o eigstate_overlap.o pair_corr_bins.o


#### Compile all

all: setup observables $(DIR_EXE)/Analyse_MC

setup:
    @mkdir -p $(DIR_BLD)

#### Compile observable objects

observables: $(addsuffix -stamp,$(OBSERVABLE_OBJECTS))

%.-stamp : %.o
    ${COMP} -c -o $@ $<

但是,在运行make时,我会收到以下信息:

make: *** No rule to make target `g_decomp_IP_orthog_sphere.o-stamp', needed by `observables'.  Stop.

所以我误解了一些事情。

如果可能的话,我还希望每个对象都要更新.h - 除了一些常见的.h文件之外还有一些常见pwd文件的文件。 。这可能吗?

或者我是否建议为每个对象编写单独的目标?

编辑:

有关变量的一些信息:

DIR_MAIN的定义方式是因为通常这个makefile将从另一个makefile调用,该makefile使用updateTable()从其目录定义DIR_MAIN;但也可以从自己的目录中调用ut。

DIR_MISC_SRC指向DIR_SRC中文件所需的一些头文件。

DIR_BLD和DIR_MISC_BLD将包含相应的结果对象文件。

1 个答案:

答案 0 :(得分:1)

错误消息确实显示了您做错了什么,但有点倾斜:

  

制作:*** g_decomp_IP_orthog_sphere.o-stamp不需要制作目标observables的规则。停止。

制作邮票文件的规则是:

%.-stamp: %.o

你可能想要那个

%.o-stamp: %.o

首先将%.o编译为%.o-stamp看起来很奇怪 - 可能你只是想要

observables: $(OBSERVABLE_OBJECTS)
.PHONY: observables

图章文件有时对您想要执行一次但没有输出文件的操作很有用。对于编译,目标文件是输出文件,所有这些都需要。

  

如果可能的话,我也希望每个要更新的对象都使用.h中的更改 - 除了一些常见的.h文件之外还有文件的文件。对象。这可能吗?

这本身就是一个完整的问题 - 你想要搜索&#34; makefile自动依赖生成&#34;作为起点。