这是我的Makefile
tcp.o: lib/tcp.h tcp.cc
g++ -c tcp.cc -o build/tcp.o
server.o: tcp.o server.cc
g++ -c server.cc -o build/server.p
g++ build/server.o build/tcp.o -o target/server
client.o: tcp.o client.cc
g++ -c client.cc -o build/client.o
g++ build/client.o build/tcp.o -o target/client
all: server.o client.o
但是在Makefile
同级目录下有边有编译过的*.o时不会有这种情况
这是肿么回事啊
Nasy
2
比如第一个,不应该是
build/tcp.o: lib/tcp.h ...
吗?他一直在 ./
下寻找 tcp.o
却找不到。不是在 build/
下寻找 tcp.o
当然反复编译了
!!!
新手受教了,蟹蟹小林
不过接下来要怎么改??
build/tcp.o: lib/tcp.h tcp.cc
g++ -c tcp.cc -o build/tcp.o
build/server: build/tcp.o server.cc
g++ -c server.cc -o build/server.o
g++ build/server.o build/tcp.o -o target/server
...
build/tcp.o
已经解决了, 其他的还不会
Nasy
4
g++ xx1 xx2 -o xxx
那前面就是 xxx: xx1 xx2
所以这里不是 build/server 是 build/server.o 和 target/server 。有两个,一般是分开写,你要合并起来写,那就写后面那个? target/server
Nasy
6
全部分开写,你就能 make -j100 之类的(
Nasy
8
指并行啦!
举个例子
x1:
cc
x2:
cc
x3:
cc
all: x1 x2 x3
make all
的时候,是先 x1 再 x2 再 x3
make all -j2
的时候,就是 x1 和 x2 一起…哪个完成了再 x3
Nasy
10
上学期,老师不给用 cmake,手写 几百行 makefile 后。。。
Nasy
11
还掌握了一些奇奇怪怪的技能,比如
# COLORS
GREEN := $(shell tput -Txterm setaf 2)
YELLOW := $(shell tput -Txterm setaf 3)
WHITE := $(shell tput -Txterm setaf 7)
RESET := $(shell tput -Txterm sgr0)
TARGET_MAX_CHAR_NUM=20
## Show help
help:
@echo ''
@echo 'Usage:'
@echo ' ${YELLOW}make${RESET} ${GREEN}<target>${RESET}'
@echo ''
@echo 'Targets:'
@awk '/^[a-zA-Z\-\.\_0-9%]+:/ { \
helpMessage = match(lastLine, /^## (.*)/); \
if (helpMessage) { \
helpCommand = $$1; sub(/:$$/, "", helpCommand); \
helpMessage = substr(lastLine, RSTART + 3, RLENGTH); \
printf " ${YELLOW}%-$(TARGET_MAX_CHAR_NUM)s${RESET} ${GREEN}%s${RESET}\n", helpCommand, helpMessage; \
} \
} \
{ lastLine = $$0 }' $(MAKEFILE_LIST)
.PHONY: help
这段可以让
## xx xxx
xx:
...
make help
的时候显示
Usage:
make <target>
Targets:
xx xx xxx
那其他有模块支持的语言呢,应该不用学Makfile
,写一堆火星文吧
Nasy
15
可以用,但是一般都有自己的(cabal cargo stack 之类的
有没有比较靠谱的 cmake 替代?
自生成 usage 我也写过
另,我其实还想吐槽一下楼主的排版。应该适当加一些空行,便于他人阅读。
xmake 看起来不错,基于 lua,语法清爽,还有界面向导——cmake如果不打小抄,我连一个 hellowold都不知怎么初始化。不过应用案例略少。
1 个赞
LdBeth
19
我用 OCaml 写的 OMake,支持 OCaml 和 C,还有 TeX,理论上也可以加别的支持。
OCaml 也要自己写 Makefile,不过一个方面有比较通行的 dune,另一方面就算自己写 Makefile 编译器提供自动生成文件依靠关系的功能。
Common Lisp 用的是 ASDF,只能给 Common Lisp 用。