make 的怪事 (每次都重新编译所有源文件)

tomjun 2005-03-22 10:22:09
当我把g++编译中得到的 .o 指定存放到一个指定的 OBJ 目录后,为什么每次make时,每个文件都会被重新编译一次,而不论是否发生有变化。

而所有 .o 文件缺省存放在 源文件 目录时,则每次make时只编译有变化的源文件。

奇怪
...全文
1354 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomjun 2005-03-25
  • 打赏
  • 举报
回复
回复人: sharkhuang(~爱一个人好难~) ( ) 信誉:100 2005-03-22 18:26:00 得分: 0


加一句
xxx:$(OBJ)
$(CPP) $(LINKOBJ) -o "appeal" $(LIBS)

执行的时候用make xxx


已有此句:
$(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

tomjun 2005-03-25
  • 打赏
  • 举报
回复
不好意思,贴错了,是这个
# Project: appeal
# Makefile created by Dev-C++ 4.9.9.0

CPP = g++
CC = gcc
RES =
OBJ = dealappeal.o main.o udpserver.o $(RES)
LINKOBJ = obj/dealappeal.o obj/main.o obj/udpserver.o $(RES)
LIBS = -L"../lib" -lmysqlclient -lpthread -lz
CXXINCS = -I"../include" -I"/usr/include"
BIN = ../../bin/appeald
CXXFLAGS = $(CXXINCS)

.PHONY: all all-before all-after clean clean-custom

all: all-before $(BIN) all-after


clean: clean-custom
rm -f $(LINKOBJ) $(BIN)

$(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

dealappeal.o: dealappeal.cpp
$(CPP) -c dealappeal.cpp -o obj/dealappeal.o $(CXXFLAGS)

main.o: main.cpp
$(CPP) -c main.cpp -o obj/main.o $(CXXFLAGS)

udpserver.o: udpserver.cpp
$(CPP) -c udpserver.cpp -o obj/udpserver.o $(CXXFLAGS)
cxjddd 2005-03-24
  • 打赏
  • 举报
回复
怎么都不见 TAB 呢?
TangChin 2005-03-24
  • 打赏
  • 举报
回复
“g++编译中得到的 .o 指定存放到一个指定的 OBJ 目录后”
你的makefile中没有实现这个功能吧。
tb01412 2005-03-22
  • 打赏
  • 举报
回复

你读一下MAKE文件的依赖规则就明白是怎么回事了!!!!
mefit 2005-03-22
  • 打赏
  • 举报
回复
不会用的make clean;make all吧
qfxx 2005-03-22
  • 打赏
  • 举报
回复
把makefile 贴出来看看
gaoxianfeng 2005-03-22
  • 打赏
  • 举报
回复

你是mv过去的?
编译目录没有.o文件了
limeigui0725 2005-03-22
  • 打赏
  • 举报
回复
up
sharkhuang 2005-03-22
  • 打赏
  • 举报
回复
加一句
xxx:$(OBJ)
$(CPP) $(LINKOBJ) -o "appeal" $(LIBS)

执行的时候用make xxx
tomjun 2005-03-22
  • 打赏
  • 举报
回复
Makefile如下:

# Project: appeal
# Makefile created by Dev-C++ 4.9.9.0

CPP = g++
CC = gcc
RES =
OBJ = dealappeal.o main.o udpserver.o $(RES)
LINKOBJ = dealappeal.o main.o udpserver.o $(RES)
LIBS = -L"../lib" -lmysqlclient -lpthread -lz
CXXINCS = -I"../include" -I"/usr/include"
BIN = appeal
CXXFLAGS = $(CXXINCS)

.PHONY: all all-before all-after clean clean-custom

all: all-before appeal all-after


clean: clean-custom
rm -f $(OBJ) $(BIN)

$(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o "appeal" $(LIBS)

dealappeal.o: dealappeal.cpp
$(CPP) -c dealappeal.cpp -o dealappeal.o $(CXXFLAGS)

main.o: main.cpp
$(CPP) -c main.cpp -o main.o $(CXXFLAGS)

udpserver.o: udpserver.cpp
$(CPP) -c udpserver.cpp -o udpserver.o $(CXXFLAGS)
tx117 2005-03-22
  • 打赏
  • 举报
回复
楼主不会不知道Makefile吧?
make是在1977年在贝尔实验室(Bell Labs)研发的 Unix系统中的一款依赖关系检查工具程序(Utility software)。make的应用非常广泛,它被用来构建 C、C++ 、Pascal  Fortran 等项目,自动化构建生成可执行文件或者库文件。make通过读取Makefile文件以自动化建构软件, 它会根据依赖文件的修改时间进行判断。确定一个target的依赖关系,然后把生成这个target的相关命令传给shell去执行。GNU make 和大多数版本的 make 之间最重要的区别是 GNU make 是自由软件,常和GNU编译系统一起被使用,是大多数GNU Linux安装的一部分。GNU makemakefile 中具有许多强大的功能,超出了其他 make 版本的功能,它还可以重新生成、使用、然后删除不需要保存的中间文件。GNU make 还有一些非常方便的简单功能。例如,选项“假装源文件文件没有更改,即使它已更改。当您向头文件添加新宏时,这非常有用。大多数版本的 make 都会假设它们必须重新编译所有使用头文件的源文件,但是如果您知道对头文件的更改不需要重新编译 GNU make 为您提供了一种避免重新编译的方法-o file 。 黄强老师针对零编程基础的同学,精心打磨make核心知识点,帮助你快速掌握Linux编程中的make的构建!适用人群: 零基础、新手、想快速学习Linux下C、C++编程的童鞋!

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧