生成main.c和main.cpp的单个Makefile

Single Makefile to build both main.c and main.cpp

本文关键字:main 单个 Makefile 生成 cpp      更新时间:2023-10-16

我希望make main-cmain.c构建main-c

CCD_ 4从CCD_ 6构建CCD_。

我有,都在同一个文件夹中:

main.c:

#include <stdio.h>
int main(int argc, char const *argv[]) {
printf("This ic Cn");
}

main.cpp:

#include <iostream>
int main(int argc, char const *argv[]) {
std::cout << "This is C++" << std::endl;
}

Makefile:

CFLAGS   = -std=gnu11
CXXFLAGS = -std=gnu++11 
CPPFLAGS = -g -Wall -O3
LDFLAGS  = 
LDLIBS   =  
OBJS     = main.o 
APP-C    = main-c
APP-CPP  = main-cpp
default:
echo "Check README.txt"
main-c: $(OBJS)
$(CC) $^ $(LDLIBS) -o $@
main-cpp: $(OBJS)
$(CXX) $^ $(LDLIBS) -o $@
clean:
-rm -Rf *.o 
distclean: clean
-rm -Rf $(APP-C) $(APP-CPP) 

因此:

$ make main-c
cc -std=gnu11 -g -Wall -O3  -c -o main.o main.c
cc main.o  -o main-c

但是(也是从.c构建的(:

$ make main-cpp
cc -std=gnu11 -g -Wall -O3  -c -o main.o main.c
c++ main.o  -o main-cpp

我期望make main-cpp使用$(CXX) $^ $(LDLIBS) -o $@并从.cpp构建。我错过了什么?

我希望make main cpp使用$(CXX($^$(LDLIBS(-o$@并从.cpp.构建

确实如此。make main-cpp --debug将帮助您了解发生了什么。

问题是,您依赖默认规则来生成main-cppmain-c目标所需的main.o,但在调用make-cpp目标时,您需要不同的构建。在这种情况下,您需要定义不同的非默认规则来构建.o文件。如果您只是让make-cppmain-c依赖于具有不同名称的.o,那么这是最简单的。由于它们是不同的构建,所以无论如何都应该有不同的名称:

CFLAGS   = -std=gnu11
CXXFLAGS = -std=gnu++11 
CPPFLAGS = -g -Wall -O3
LDFLAGS  = 
LDLIBS   =  
APP-C   = main-c
APP-CPP  = main-cpp
default:
echo "Check README.txt"
main-c: %:%.o
$(CC) $^ $(LDLIBS) -o $@
main-cpp: %:%.o
$(CXX) $^ $(LDLIBS) -o $@
main-cpp.o: main.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $? -o $@
main-c.o: main.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c $? -o $@
clean:
-rm -Rf *.o 
distclean: clean
-rm -Rf $(APP-C) $(APP-CPP)

main-cmain-cpp这两个规则都需要创建main.o才能完成,但您没有创建main.o的规则。

您正在使用make的隐式对象文件创建,这是从源文件创建".o"文件的内置规则。它可以使用".c"或".cpp/cc/c"文件,并将使用适当的变量进行构建。但是,由于您同时拥有main.cmain.cpp,因此看起来默认使用C版本。

您可能需要为每个规则创建明确的规则(并且可能使用不同的名称(。