Makefile 老是反复编译

这是我的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

ezgif-7-5ce61fcdc43c


但是在Makefile同级目录下有边有编译过的*.o时不会有这种情况
这是肿么回事啊

比如第一个,不应该是

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已经解决了, 其他的还不会

g++ xx1 xx2 -o xxx 那前面就是 xxx: xx1 xx2

所以这里不是 build/server 是 build/server.o 和 target/server 。有两个,一般是分开写,你要合并起来写,那就写后面那个? target/server

image
蟹蟹小林,我觉得自己有必要去复习一遍

全部分开写,你就能 make -j100 之类的(

???
一脸懵逼

指并行啦!

举个例子

x1:
  cc
x2:
  cc
x3:
  cc
all: x1 x2 x3

make all 的时候,是先 x1 再 x2 再 x3

make all -j2 的时候,就是 x1 和 x2 一起…哪个完成了再 x3

真厉害。

写这么密集我一行都看不进去。

上学期,老师不给用 cmake,手写 几百行 makefile 后。。。

还掌握了一些奇奇怪怪的技能,比如

 # 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

C++20的模块出来以后,可以减少这种写法吗

不知道😂

反正,基本上我不需要用 C++ 了

那其他有模块支持的语言呢,应该不用学Makfile,写一堆火星文吧

可以用,但是一般都有自己的(cabal cargo stack 之类的

有没有比较靠谱的 cmake 替代?

自生成 usage 我也写过 :smile:

另,我其实还想吐槽一下楼主的排版。应该适当加一些空行,便于他人阅读。

写 python 的话,scons

Haskell 也有个 shake

不知道有没有 lisp 版本的

xmake 看起来不错,基于 lua,语法清爽,还有界面向导——cmake如果不打小抄,我连一个 hellowold都不知怎么初始化。不过应用案例略少。

1 个赞

我用 OCaml 写的 OMake,支持 OCaml 和 C,还有 TeX,理论上也可以加别的支持。

OCaml 也要自己写 Makefile,不过一个方面有比较通行的 dune,另一方面就算自己写 Makefile 编译器提供自动生成文件依靠关系的功能。

Common Lisp 用的是 ASDF,只能给 Common Lisp 用。

事实上,Nix/Guix也是一种编译系统