单个Makefile来构建main.c和main.cpp

时间:2018-07-15 03:31:28

标签: c++ c makefile gnu-make c11

我想DocumentRefmake main-c构建main-c

然后用main.cmake main-cpp构建main-cpp

我都在同一个文件夹中

main.cpp

main.c

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

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 $@开始构建。我想念什么?

2 个答案:

答案 0 :(得分:1)

  

我期望使main-cpp使用$(CXX)$ ^ $(LDLIBS)-o $ @并从.cpp进行构建。

是的。 make main-cpp --debug将帮助您了解发生了什么。

问题是您要依靠默认规则来创建main.omain-cpp都需要的main-c,但是当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)

答案 1 :(得分:0)

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

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

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