我在Linux下編成時(shí),用Makefile文件生成的.o文件老是跟我的源文件在同一個(gè)目錄下,搞得我用TAB鍵之余還得先再敲.c再TAB,為什么要多敲兩次鍵盤?如果我把所有生成的.o文件放比如./obj目錄下,豈不是少來(lái)很多麻煩?而且ls時(shí)免得見(jiàn)到那么多垃圾多好?!
誰(shuí)愿意犧牲自己來(lái)幫忙搞定?我愿意提供100大洋來(lái)獎(jiǎng)勵(lì)!
比如我再./src下面有10個(gè)源文件(.cpp),再./include下有很多頭文件,我想在./src下編譯的obj文件(.o文件)放到./obj下。該如何?
要求:
1、別告訴我在每一個(gè)gcc -c后面來(lái)一個(gè)mv指令
2、如果我已經(jīng)編譯過(guò)一次,后來(lái)我修改了一個(gè)文件,那么應(yīng)該也只編譯一個(gè)文件
問(wèn)題點(diǎn)數(shù):100、回復(fù)次數(shù):9Top
不知你是用什么生成Makefile文件的。我以前用過(guò)tmake,先寫一個(gè).pro文件,然后用tmake生成Makefile。pro文件里有一個(gè)選項(xiàng)OBJDIR,修改它就可以改變目標(biāo)文件的存放路徑了。
建議你去下載一個(gè)tmake看一下,有什么問(wèn)題在寫出來(lái)大家討論。Top
你在makefile里面.o文件之前加上路徑名就行了,比如../obj/main.o
注意使用-o選項(xiàng),使得所有目標(biāo)文件都存在../obj/目錄下Top
如樓上所說(shuō),給你舉個(gè)例子先:
假如預(yù)編譯x.cpp文件
./obj/x.o: ./src/x.cpp
g++ -c ./src/x.cpp -o ./obj/x.oTop
謝謝各位大哥,你們的方法我知道,而且通過(guò)修改我的
http://expert.csdn.net/Expert/topic/1389/1389206.xml?temp=.1599237
上面的代碼也可以完成,不過(guò)我是想偷一下懶:每次不創(chuàng)建一個(gè)工程時(shí)不需要修改太多的信息。不如下面的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)
這個(gè)不需要做任何修改,就可以拷貝到任何C目錄下編譯(當(dāng)然要求所有的cpp文件在同一目錄下)
后來(lái)我做了一點(diǎn)改動(dòng),也就是:
$(GCC) -o $@ $(OBJECTS) $(CFLAG) $(SYSLIB)
改為:
$(GCC) -o $@ @(patsubst %.o,./obj/%.o,$^) $(CFLAG) $(SYSLIB)
$(GCC) -c $< $(CXXFLAG)
改為:
$(GCC) -c $< $(CXXFLAG) -o ./obj/$(patsubst %.cpp,%.o,$<)
它確實(shí)可以將編譯好的.o連接文件給我放到./obj下。但是不過(guò)何時(shí)編譯它都編譯所有文件。
請(qǐng)各位大哥再給出明確指示。將感激不禁?。?!
-----------------------------
我是一個(gè)懶人,不要責(zé)備我連這點(diǎn)事情都不愿意去做。
不過(guò)我相信:
是懶人在促進(jìn)世界的發(fā)展?。?a >Top
OBJDIR=obj
OBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(wildcard *.c))
all : $(OBJS)
$(OBJDIR)/%.o : %.c
cc -o $@ $<
Top
還是用專門工具來(lái)做這些吧,把自己從這些低級(jí)手工勞作中解放出來(lái)吧!Top
honix(春眠醒不了) :
好,不過(guò)還是解決不了每次都編譯所有的問(wèn)題Top
不可能吧,看看我機(jī)器上測(cè)試過(guò)程:
[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
謝謝!總算找到問(wèn)題了。
很不好意思,我將原來(lái)的Makefile備份成makefile,我想Linux是區(qū)分大小寫的,所以就沒(méi)有在意。后來(lái)我突然發(fā)現(xiàn)我的Makefile有語(yǔ)法問(wèn)題,但是make時(shí)確沒(méi)有給我錯(cuò)誤。于是就懷疑到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拷貝到相應(yīng)的源文件下面,并再源文件的路徑處建立一個(gè)obj目錄,這樣每次Makefile就將產(chǎn)生的目標(biāo)文件放到obj目錄下,而不會(huì)煩你了。
謝謝honix(春眠醒不了)
等幾天再結(jié)貼吧,讓大家也看看
聯(lián)系客服