首页 > 解决方案 > 用于构建 main.c 和 main.cpp 的单个 Makefile

问题描述

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

并从. make main-cpp_main-cppmain.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. 我错过了什么?

标签: c++cmakefilegnu-makec11

解决方案


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

这是。make main-cpp --debug将帮助您了解正在发生的事情。

问题是您依赖默认规则来制作和目标main.o所需的内容,但是在调用目标时您需要不同的构建。在这种情况下,您需要定义不同的非默认规则来构建 .o 文件。如果您只制作并依赖具有不同名称的 .o,这是最简单的。由于它们是不同的版本,因此无论如何它们都应该具有不同的名称:main-cppmain-cmake-cppmake-cppmain-c

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)

推荐阅读