gpt4 book ai didi

c++ - 在 Makefile 中分别处理变量中的所有文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:06 25 4
gpt4 key购买 nike

我在一个目录中有多个源文件,其中一些负责一个主要的可执行文件,一些负责一个共享库,而共享库又是主要可执行文件所需要的。因此,我按以下方式编写了 makefile:

CC=gcc
CXX=g++
CFLAGS=-I$(DIR) -fPIC -c -fopenmp
CXXLFLAGS=-I$(DIR) -fopenmp -O3 -g -march=native -std=gnu++17 -fPIC -c
CXXFLAGS=-I$(DIR) -fopenmp -O3 -g -march=native -std=gnu++17 -c
LDFLAGS=-lfftw3 -lgomp -lm -larmadillo -lpthread -lX11 -lboost_system -lboost_program_options -L/opt/intel/mkl/lib/intel64 -lmkl_rt
LDMAINFLAGS=-lfftw3 -lgomp -lm -larmadillo -lpthread -lX11 -lboost_system -lboost_program_options -L/opt/intel/mkl/lib/intel64 -lmkl_rt -lpulse_propagation
LIBSOURCES=source/image_processing.cpp source/pulse_propagation.cpp
LIBOBJECTS=source/image_processing.o source/pulse_propagation.o
MAINSOURCES=source/fftw.cpp source/fftw++.cc
MAINOBJECTS=source/fftw.o source/fftw++.o
EXECUTABLE=fftw
LIBRARY=libpulse_propagation.so

.PHONY: default all clean

default: all

all: $(LIBRARY) main

main: $(LIBRARY) $(MAINOBJECTS)
$(CXX) $(LDFLAGS) $(MAINOBJECTS) -o $(EXECUTABLE)

$(LIBRARY): $(LIBOBJECTS)
$(CXX) $(LDFLAGS) -shared $^ -o $@

$(LIBOBJECTS): $(LIBSOURCES)
$(CXX) $(CXXLFLAGS) $^ -o $@

$(MAINOBJECTS): $(MAINSOURCES)
$(CXX) $(CXXFLAGS) $^ -o $@

clean_compile:
rm -f source/*.o

clean:
rm -f source/*.o $(EXECUTABLE) $(LIBRARY)

所有标有 MAIN 的东西属于主要可执行文件,其他所有内容都属于库。我想遍历 LIBSOURCES 中的文件/MAINSOURCES并编译它们中的每一个。如果我不必使用 .cpp.o: 我会更愿意-macro,在有不同的标志之后取决于它是库文件还是主文件。我尝试使用 $< ,它执行了两次编译(正常),但始终使用变量列表中的第一个值。使用 $^ 时相反,两个文件同时使用,也会导致错误。我怎么能这样做呢?

最佳答案

您的 source/fftw++.cc 而不是 source/fftw++.cpp 使一切变得毫无用处。如果你可以重命名它,那么下面应该做你想做的:

$(LIBOBJECTS): CXXFLAGS := $(CXXLFLAGS)

$(LIBOBJECTS) $(MAINOBJECTS): %.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@

第一行为 $(LIBOBJECTS) 目标定义变量 CXXFLAGS 的值。以下规则是 static pattern rule这转化为具有一个目标和一个先决条件的尽可能多的规则。这与您将一种所有源文件声明为所有相应目标文件的先决条件的规则完全不同。通常不是您想要的。

如果您不能重命名 source/fftw++.cc,您可以拆分源和对象列表:

MAINCPPSOURCES=source/fftw.cpp
MAINCCSOURCES=source/fftw++.cc
MAINCPPOBJECTS=source/fftw.o
MAINCCOBJECTS=source/fftw++.o

$(LIBOBJECTS): CXXFLAGS := $(CXXLFLAGS)

$(LIBOBJECTS) $(MAINCPPOBJECTS): %.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@

$(MAINCCOBJECTS): %.o: %.cc
$(CXX) $(CXXFLAGS) $< -o $@

最后,如果您计算可能的结果而不是在 Makefile 中硬连接它可能会更好(更易于维护):

MAINCPPOBJECTS = $(patsubst %.cpp,%.o,$(MAINCPPSOURCES))
MAINCCOBJECTS = $(patsubst %.cc,%.o,$(MAINCCSOURCES))
...

关于c++ - 在 Makefile 中分别处理变量中的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48150027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com