【发布时间】:2015-06-18 11:26:10
【问题描述】:
我使用 C 和 C++,感谢 this answer 我能够编译和运行我的项目。现在我正在写一个makefile来打发时间。但是事情变得复杂了:
项目结构
- 项目
- 制作文件
- 客户端
- bin
- 源
- c
- cc
- java
- 服务器
- ...
# Directories
# CLIENT
CLIENT_BIN_DIR = /client/bin/
CLIENT_SRC_C_DIR = /client/src/c/
CLIENT_SRC_CC_DIR = /client/src/cc/
CLIENT_SRC_JAVA_DIR = /client/src/java/
# SECC
SERVER_BIN_DIR = /server/bin/
SERVER_SRC_C_DIR = /server/src/c/
SERVER_SRC_CC_DIR = /server/src/cc/
SERVER_SRC_JAVA_DIR = /server/src/java/
# Files
# CLIENT
CLIENT_BIN = ${CLIENT_BIN_DIR}client_app
CLIENT_SRC_C = ${wildcard ${CLIENT_SRC_C_DIR}*.c}
CLIENT_SRC_CC = ${wildcard ${CLIENT_SRC_CC_DIR}*.cc}
CLIENT_SRC_JAVA = ${wildcard ${CLIENT_SRC_JAVA_DIR}*.java}
# SERVER
SERVER_BIN = ${SERVER_BIN_DIR}server_app
SERVER_SRC_C = ${wildcard ${SERVER_SRC_C_DIR}*.c}
SERVER_SRC_CC = ${wildcard ${SERVER_SRC_CC_DIR}*.cc}
SERVER_SRC_JAVA = ${wildcard ${SERVER_SRC_JAVA_DIR}*.java}
# Flags
CFLAGS = -g -W -Wall
IFLAGS = -I${INC_DIR}
# Compilers
C = gcc
CC = g++
# Rules
all: ${CLIENT_BIN} ${SERVER_BIN}
${CLIENT_BIN}:
${SERVER_BIN}:
// NEED HELP HERE
现在我有了所有的源文件,我应该在每个文件的以下步骤中写什么:
gcc -c -o file.o file.cg++ -c -o file.o file.cc -I/PATH_TO_C_HEADERg++ -o APP_NAME C_O_FILES CC_O_FILES
【问题讨论】:
-
我建议在每个需要编译源码的目录下放置一个Makefile,它只负责编译该目录下的源码。然后,您的父 makefile(对于项目)需要做的就是调用其他 makefile 并担心它自己的目标(例如客户端和源)。
-
Make 让人头疼,递归 make 是一种错误模式。用
tup(gittup.org/tup) 来做。它更简单、更先进、更快,而且您不必担心标头依赖性。 -
如果你不需要使用 make 使用类似
tup的东西当然是一个合理的想法。如果你确实需要(或想要)让它工作得很好。 -
@Peter 您可能想阅读 dsi 的链接,了解为什么递归 make 是一个坏主意。