Makefile一问:如何修改.o输出文件的输出路径 Linux/Unix社区 / 程序开...

来源:百度文库 编辑:神马文学网 时间:2024/06/13 00:26:33
Makefile一问:如何修改.o输出文件的输出路径
eion(那个谁)2003-04-15 16:58:04 在 Linux/Unix社区 / 程序开发区 提问
我在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
future_path(放眼未来)回复于 2003-04-15 18:38:19 得分 10
不知你是用什么生成Makefile文件的。我以前用过tmake,先写一个.pro文件,然后用tmake生成Makefile。pro文件里有一个选项OBJDIR,修改它就可以改变目标文件的存放路径了。
建议你去下载一个tmake看一下,有什么问题在写出来大家讨论。Top
hs_guanqi(关七)回复于 2003-04-15 18:42:52 得分 15
你在makefile里面.o文件之前加上路径名就行了,比如../obj/main.o
注意使用-o选项,使得所有目标文件都存在../obj/目录下Top
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
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
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
tiejun(21世纪牛顿)回复于 2003-04-16 15:32:14 得分 0
还是用专门工具来做这些吧,把自己从这些低级手工劳作中解放出来吧!Top
eion(那个谁)回复于 2003-04-16 17:39:54 得分 0
honix(春眠醒不了)   :
好,不过还是解决不了每次都编译所有的问题Top
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
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(春眠醒不了)
等几天再结贴吧,让大家也看看
Makefile一问:如何修改.o输出文件的输出路径 Linux/Unix社区 / 程序开... 用GCC将源文件编译成库文件的问题 Linux/Unix社区 / 程序开发区 用GCC将源文件编译成库文件的问题 Linux/Unix社区 / 程序开发区 用GCC将源文件编译成库文件的问题 Linux/Unix社区 / 程序开发区 - CSDN社区 community.csdn.net 最简单的C++程序/输出Hello Linux内核Makefile文件 Linux库文件和Shell可执行程序命令文件搜索路径变量的设置 [PHP Excel 输出]使用 PHP 输出带格式的 Excel 文件(转来的) 如何将只能输出摘要的RSS源转化成输出全文的RSS源 问专家-Makefile文件的格式与用法 如何订阅不提供RSS Feed输出的网站? 如何订阅不提供RSS Feed输出的网站 如何输出革命 古巴的30年“非洲人民战争”史 vb6.0中Spread输出CSV文件 借用DIR命令,集中输出文件目录 linux下Makefile文件的编写 - 红联Linux门户 - 中国领先的Linux技... android调试程序,如何实现像java一样在控制台中输出结果_Android_手机开发... 用dlopen和dlsym得到的函数指针,在dlclose后还能继续使用么? - Linux/Unix社区 / 程序开发区 PLC晶体管输出与继电器输出的区别 整店输出,输出的不只是概念! 电视接收机的输入/输出信号 Unix/Linux中编辑文件的命令VI详细介绍 Unix/Linux中编辑文件的命令VI详细介绍 C++标准库提供了基于输入/输出流机制的文件操作