c++ - 用于构建 main.c 和 main.cpp 的单个 Makefile
问题描述
我想make main-c
从main-c
.main.c
并从. make 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 $@
和构建.cpp
. 我错过了什么?
解决方案
我期待 make main-cpp 使用 $(CXX) $^ $(LDLIBS) -o $@ 并从.cpp构建。
这是。make main-cpp --debug
将帮助您了解正在发生的事情。
问题是您依赖默认规则来制作和目标main.o
所需的内容,但是在调用目标时您需要不同的构建。在这种情况下,您需要定义不同的非默认规则来构建 .o 文件。如果您只制作并依赖具有不同名称的 .o,这是最简单的。由于它们是不同的版本,因此无论如何它们都应该具有不同的名称:main-cpp
main-c
make-cpp
make-cpp
main-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)
推荐阅读
- docker - Docker 中的电子:SIGTRAP、ELIFECYCLE、errno1
- node.js - 如何以编程方式将 Google Apps 脚本部署为标准 GCP 项目
- node.js - Node.js 中单向交易的安全加密
- vb.net - 这意味着“Sub 过程执行一项任务,然后将控制权返回给调用代码”
- node.js - 试图让用户登录工作的问题.. MERN 堆栈未处理的承诺拒绝:错误:请求失败,状态码 400 试图让用户登录
- .net - 如何使用通用夹具并行执行 xUnit 类测试?
- c++ - 字符数组在输出时添加随机字符
- windows - 如何更改 Windows 版 Git Bash 的启动位置?
- xml - 使用 XML 文件作为 DataGridView 的数据源并过滤日期 C# 时如何通过 RowFilter 过滤 DataView?
- javascript - iframe 嵌入网站 - href 链接未在外部浏览器中打开