繁体   English   中英

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

[英]Single Makefile to build both main.c and main.cpp

我想make main-c main-cmain.c构建main-c

make main-cpp main-cppmain.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 $@并从.cpp构建。 我想念什么?

我期望使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版本。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM