makefile obj文件路径_Makefile一问:如何修改.o输出文件的输出路径 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

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(春眠醒不了)

等几天再结贴吧,让大家也看看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PreparedStatement

1 //一般使用方法2 //优点在于简化sql语句的使用3 4 5 int deptno 0;6 String dname args[1];7 String loc args[2];8 9 10 11 Connection conn null; 12 13 PreparedStatement stmt null; 14 15 Class.forName("oracle.jdbc.driver.OracleDriver"); 16 17…

让Dapper支持Mock

Dapper&#xff0c;在.net的ORM中占有一席之地&#xff0c;用法简单&#xff0c;灵活&#xff0c;使用如下。但也带来一个问题&#xff0c;就是在单元测试时&#xff0c;Mock比较难办。public List<Goods> GetAllGoods(){using var con new SqlConnection();var sql &q…

收藏 | 分享 3 种脑洞大开的Excel技巧

全世界只有3.14 % 的人关注了数据与算法之美身为职场人&#xff0c;Excel基本是每天都会打开的软件&#xff0c;如果把对它的使用熟练程度分个等级&#xff0c;大概可以分为几下几种&#xff1a;Level 1&#xff1a;对Excel的基本功能已经有所了解&#xff0c;但还不熟练&#…

Java JSON对象怎么遍历_Java遍历JsonObject对象

方法&#xff1a;Iterator iter jsonInfo.entrySet().iterator();代码示例&#xff1a;public class Test {public static void main(String[] args) {JSONObject jsonInfo new JSONObject();String key1 "a";jsonInfo.put(key1, "aa");String key2 &q…

飞机加油的问题

一道关于飞机加油的问题&#xff0c;已知&#xff1a;每个飞机只有一个油箱&#xff0c;飞机之间可以相互加油(注意是相互&#xff0c;没有加油机一箱油可供一架飞机绕地球飞半圈&#xff0c; 问题&#xff1a;为使至少一架飞机绕地球一圈回到起飞时的飞机场&#xff0c;至少需…

如何学人工智能的思考

起因&#xff1a;昨晚在人工智能大师班微信群里有同事问&#xff0c;数学如何学。我有感而发发表了一下我学习人工智能的思路。一觉睡醒&#xff0c;昨晚的讨论又让我有了新的思考。所以写了这篇文章。背景&#xff1a;1. 我曾经花过几个月的时间去学习人工智能里的专家系统和P…

yaml for java_细数Java项目中用过的配置文件(YAML篇)

灵魂拷问&#xff1a;YAML&#xff0c;在项目中用过没&#xff1f;它与 properties 文件啥区别&#xff1f;目前 SpringBoot、SpringCloud、Docker 等各大项目、各大组件&#xff0c;在使用过程中几乎都能看到 YAML 文件的身影。2017 年的时候&#xff0c;我才真正把 YAML 文件…

思科路由PPPOE基本配置

思科PPPOE基本配置用思科路由怎样配置PPPOE&#xff0c;自动拨号上网1、第一步&#xff1a;首先要配置VPDN组R1(config)#vpdn enableR1(config)#vpdn-group 1R1(config-vpdn)#request-dialinR1(config-vpdn-req-in)#protocol pppoe2、第二步&#xff1a;配置路由器连接ADSL MOD…

超全面!8 种互联网常用生命周期完整指南~

什么是生命周期&#xff1f; 百度给出的定义是&#xff1a;生命周期就是指一个对象的生老病死。 生命周期的概念应用很广泛&#xff0c;特别是在政治、经济、环境、技术、社会等诸多领域经常出现&#xff0c;其基本涵义可以通俗地理解为“从摇篮到坟墓”的整个过程。对于某个…

技术分享|集成开放平台使用Consul Watch机制实现配置热更新

源宝导读&#xff1a;在微服务架构体系中&#xff0c;由于微服务众多&#xff0c;服务之间又有互相调用关系&#xff0c;因此&#xff0c;一个通用的分布式配置管理是必不可少的。本文将介绍如何使用Consul Watch机制实现配置集中管理与热更新。前言随着程序功能的日益复杂&…

14个超有料的优质公众号,关注了就舍不得删

全世界有3.14 % 的人已经关注了数据与算法之美关注了那么多公众号&#xff0c;百无聊奈地看文章你是否觉得时间被浪费&#xff0c;生命被辜负了&#xff1f;在号的数量上做减法&#xff0c;质量上做加法接下来给大家推荐最近一直在阅读的几个优质公众号每一篇推文都值得你点开长…

python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目

随着人工智能的兴起&#xff0c;国内掀起了一股Python学习热潮&#xff0c;入门级编程语言&#xff0c;大多选择Python&#xff0c;有经验的程序员&#xff0c;也开始学习Python&#xff0c;正所谓是人生苦短&#xff0c;我用Python有个Python入门练手项目&#xff0c;一直没有…

ssh证书登录(实例详解)

前言 本文基于实际Linux管理工作&#xff0c;实例讲解工作中使用ssh证书登录的实际流程&#xff0c;讲解ssh证书登录的配置原理&#xff0c;基于配置原理&#xff0c;解决实际工作中&#xff0c;windows下使用SecureCRT证书登录的各种问题&#xff0c;以及实现hadoop集群部署要…

基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)

大家应该都知道几个很常见的例子&#xff0c;比如在张学友的演唱会&#xff0c;在安检通道检票时&#xff0c;通过人像识别系统成功识别捉了好多在逃人员&#xff0c;被称为逃犯克星&#xff1b;人行横道不遵守交通规则闯红灯的路人被人脸识别系统抓拍放在大屏上以示警告&#…

这些数据获取方式,一般人不知道

全世界只有3.14 % 的人关注了数据与算法之美在这个用数据说话的时代&#xff0c;能够打动人的往往是用数据说话的理性分析&#xff0c;无论是对于混迹职场的小年轻&#xff0c;还是需要数据进行分析和研究的同学&#xff0c;能够找到合适的数据源都是非常重要的。特别是想要对一…

ftp 笔记

Ubuntu自带wget。如果没有密码的ftp&#xff0c;直接wget ftp://111.222.33.4/path/filename&#xff0c;就可以下载ftp://111.222.33.4的文件夹path里的文件filename。如果是有密码的ftp&#xff0c;则wget ftp://username:passwordftp.111.222.33.4/path/filename。如果用的…

java定义构造方法_JAVA基础学习之路(三)类定义及构造方法

类的定义及使用一&#xff0c;类的定义classBook {//定义一个类intprice;//定义一个属性intnum;public static int getMonney(int price, intnum) {//定义一个方法return price*num;}}public classtest2 {public static voidmain(String args[]) {Book monney newBook();//声明…

通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...

上一篇我们讲到了dapr提供的bindings&#xff0c;通过绑定可以让我们的程序轻装上阵&#xff0c;在极端情况下几乎不需要集成任何sdk&#xff0c;仅需要通过httpclienttext.json即可完成对外部组件的调用&#xff0c;这样只需要对外暴露一个轻量级的http服务器提供restapi即可作…

了解IT行业前沿应用,关注数据与算法之美

点击上方蓝色字体&#xff0c;关注我们!

windows php的Memcache安装和使用方法

下载 &#xff1a;memcached.exe解压到 下载&#xff1a;php_memcache.dll 把它放入php文件夹的ext目录中。在php.ini加入一行引用扩展&#xff0c;代码如下&#xff1a;extensionphp_memcache.dll重启Apache服务器然后查看一下phpinfo可以找到memcache信息 说明安装成功测试启…