c++ - 编译目录中的所有源文件并将objs存储在不同的目录中

标签 c++ makefile

以下是我的make文件

CC = g++

CFLAGS = -Wall -c -fPIC

INCLUDES = -I${HOME}/ComingSoon/api/include

LFLAGs = -L${HOME}/ComingSoon/lib

LIB_DIR = ${HOME}/ComingSoon/lib

LIBS = -lapi
API_SRCDIR = ${HOME}/ComingSoon/api/source
API_SOURCE = $(wildcard ${HOME}/ComingSoon/api/source/*.cpp)
#API_SOURCE    = $(shell find $(API_SRCDIR) -name '*.cpp')
API_OBJ_SOURCE = $(wildcard ${HOME}/ComingSoon/api/obj/*.o)

OBJS_DIR_API = ${HOME}/ComingSoon/api/obj/

OBJS = $(patsubst $(API_SRCDIR)/%.cpp,$(OBJS_DIR_API)%.o,$(API_SOURCE))

api: $(OBJS)

$(OBJS): $(API_SOURCE) Makefile
    $(CC) $(CFLAGS) $(INCLUDES) $< -o  $@

clean_api:
    rm -rf ${HOME}/ComingSoon/lib/*.so
    rm -rf ${HOME}/ComingSoon/api/obj/*.o

我要编译源目录下的所有源文件。

make 文件编译为

g++ -Wall -c -fPIC -I/home/soumya/ComingSoon/api/include /home/soumya/ComingSoon/api/source/multiply.cpp -o  /home/soumya/ComingSoon/api/obj/multiply.o
g++ -Wall -c -fPIC -I/home/soumya/ComingSoon/api/include /home/soumya/ComingSoon/api/source/multiply.cpp -o  /home/soumya/ComingSoon/api/obj/add.o

但是输出应该是这样的

g++ -Wall -c -fPIC -I/home/soumya/ComingSoon/api/include /home/soumya/ComingSoon/api/source/multiply.cpp -o  /home/soumya/ComingSoon/api/obj/multiply.o
g++ -Wall -c -fPIC -I/home/soumya/ComingSoon/api/include /home/soumya/ComingSoon/api/source/add.cpp -o  /home/soumya/ComingSoon/api/obj/add.o

makfile 将同一个源文件编译成两个不同的目标文件。我哪里做错了? 我应该用什么来代替

$(OBJS): $(API_SOURCE) 生成文件

最佳答案

你的 API_SOURCE变量包含 multiply.cpp add.cpp , 所以你的规则是:

$(OBJS): multiply.cpp add.cpp Makefile
    $(CC) ... $< -o  $@

所以 $<总是扩展到 multiply.cpp .正确的方法是写一个pattern rule :

$(OBJS_DIR_API)%.o: $(API_SRCDIR)/%.cpp Makefile
    $(CC) ... $< -o  $@

关于c++ - 编译目录中的所有源文件并将objs存储在不同的目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47380289/

相关文章:

c++ - 复制结构 tm

C++/生成文件错误 : undefined reference to `main'

opengl - 如何为freeglut编写configure.ac和Makefile.am?

c++ - 使用模板打印一个类

c++ - 如何填充非线性树

c++ - 结构元素的枚举 C++

linux - 什么是 makefile, 'make install' 等?

C++ 变量作用域问题

linux - 在 makefile 中搜索子目录并更新路径变量

c - make 找不到 sys/signal.h