我在Linux下编成时,用Makefile文件生成的.o文件老是跟我的源文件在同一个目录下,搞得我用TAB键之余还得先再敲.c再TAB,为什么要多敲两次键盘?如果我把所有生成的.o文件放比如./obj目录下,岂不是少来很多麻烦?而且ls时免得见到那么多垃圾多好?!
谁愿意牺牲自己来帮忙搞定?我愿意提供100大洋来奖励!
比如我再./src下面有10个源文件(.cpp),再./include下有很多头文件,我想在./src下编译的obj文件(.o文件)放到./obj下。该如何?
要求:
1、别告诉我在每一个gcc -c后面来一个mv指令
2、如果我已经编译过一次,后来我修改了一个文件,那么应该也只编译一个文件
问题点数:100、回复次数:9Top
1 楼future_path(放眼未来)回复于 2003-04-15 18:38:19 得分 10
不知你是用什么生成Makefile文件的。我以前用过tmake,先写一个.pro文件,然后用tmake生成Makefile。pro文件里有一个选项OBJDIR,修改它就可以改变目标文件的存放路径了。
建议你去下载一个tmake看一下,有什么问题在写出来大家讨论。Top
2 楼hs_guanqi(关七)回复于 2003-04-15 18:42:52 得分 15
你在makefile里面.o文件之前加上路径名就行了,比如../obj/main.o
注意使用-o选项,使得所有目标文件都存在../obj/目录下Top
3 楼alangxy(阿郎)回复于 2003-04-16 13:58:20 得分 25
如楼上所说,给你举个例子先:
假如预编译x.cpp文件
./obj/x.o: ./src/x.cpp
g++ -c ./src/x.cpp -o ./obj/x.oTop
4 楼eion(那个谁)回复于 2003-04-16 15:10:04 得分 0
谢谢各位大哥,你们的方法我知道,而且通过修改我的
http://expert.csdn.net/Expert/topic/1389/1389206.xml?temp=.1599237
上面的代码也可以完成,不过我是想偷一下懒:每次不创建一个工程时不需要修改太多的信息。不如下面的Makefile文件:
PROJECT=abc
SYSLIB=-lpthread
CFLAG=-g
CXXFLAG=
CC=gcc
GCC=gcc
SOURCES=$(wildcard *.cpp)
OBJECTS=$(patsubst %.cpp,%.o,$(SOURCES))
$(PROJECT):$(OBJECTS)
$(GCC) -o $@ $(OBJECTS) $(CFLAG) $(SYSLIB)
.cpp.o:
$(GCC) -c $< $(CXXFLAG)
clean:
rm -rf *.o $(PROJECT)
这个不需要做任何修改,就可以拷贝到任何C目录下编译(当然要求所有的cpp文件在同一目录下)
后来我做了一点改动,也就是:
$(GCC) -o $@ $(OBJECTS) $(CFLAG) $(SYSLIB)
改为:
$(GCC) -o $@ @(patsubst %.o,./obj/%.o,$^) $(CFLAG) $(SYSLIB)
$(GCC) -c $< $(CXXFLAG)
改为:
$(GCC) -c $< $(CXXFLAG) -o ./obj/$(patsubst %.cpp,%.o,$
它确实可以将编译好的.o连接文件给我放到./obj下。但是不过何时编译它都编译所有文件。
请各位大哥再给出明确指示。将感激不禁!!!
-----------------------------
我是一个懒人,不要责备我连这点事情都不愿意去做。
不过我相信:
是懒人在促进世界的发展!!Top
5 楼honix()回复于 2003-04-16 15:19:11 得分 20
OBJDIR=obj
OBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(wildcard *.c))
all : $(OBJS)
$(OBJDIR)/%.o : %.c
cc -o $@ $<
Top
6 楼tiejun(21世纪牛顿)回复于 2003-04-16 15:32:14 得分 0
还是用专门工具来做这些吧,把自己从这些低级手工劳作中解放出来吧!Top
7 楼eion(那个谁)回复于 2003-04-16 17:39:54 得分 0
honix(春眠醒不了) :
好,不过还是解决不了每次都编译所有的问题Top
8 楼honix()回复于 2003-04-16 18:26:58 得分 30
不可能吧,看看我机器上测试过程:
[root@galileo tmp]# ls
Makefile obj readpci.c
[root@galileo tmp]# cat Makefile
OBJDIR=obj
OBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(wildcard *.c))
all : $(OBJS)
$(OBJDIR)/%.o : %.c
cc -o $@ $<
[root@galileo tmp]# make
cc -o obj/readpci.o readpci.c
[root@galileo tmp]# make
make: Nothing to be done for `all'.
[root@galileo tmp]#
Top
9 楼eion(那个谁)回复于 2003-04-17 09:40:32 得分 0
谢谢!总算找到问题了。
很不好意思,我将原来的Makefile备份成makefile,我想Linux是区分大小写的,所以就没有在意。后来我突然发现我的Makefile有语法问题,但是make时确没有给我错误。于是就怀疑到makefile上,将makefile移走,再make就OK了
我将Makefile改写成下面的形式:
PROJECT=abc
MYLIB=
SYSLIB=
CFLAG=-g
CC=gcc
GCC=gcc
OBJDIR=./obj
SRCS=$(wildcard *.cpp)
OBJS=$(patsubst %.cpp,$(OBJDIR)/.o,$(SRCS))
$(PROJECT):$(OBJS)
$(GCC) -o $@ $^ $(CFLAG) $(SYSLIB) $(MYLIB)
$(OBJDIR)/%.o:%.cpp
$(GCC) -c -o $@ $<
clean:
rm -f $(OBJDIR)/*.o $(PROJECT)
这样每次只需要将Makefile拷贝到相应的源文件下面,并再源文件的路径处建立一个obj目录,这样每次Makefile就将产生的目标文件放到obj目录下,而不会烦你了。
谢谢honix(春眠醒不了)
等几天再结贴吧,让大家也看看