Makefile 初学的简单问题,怎么把obj文件生成到一起

木落 2012-01-26 03:47:31
编译环境是MSVC,开始的Makefile本身简单极了:

bin = "program.exe"
objects = main.obj

$(bin) : main.obj
$(CC) -o $(bin) $(objects)

main.obj : main.c
$(CC) -c main.c

之后想要把目标文件都生成到../obj这个目录里面,结果就杯具了啊...

目录结构
Project
- bin
- src [Makefile在这里]
- obj

首先我make以后工作目录在src,由于cl没有指定obj文件路径的选项,所以我只能靠切换工作路径来实现,比如:

cd ../obj
cl -c ../src/main.c

但是我要是每个目标文件都这么写一遍也太他喵的蛋痛了吧!

我的思路是:
1. 找到一个Makefile每次make都首先执行的部分(就像c中的main.c)
2. 在上述部分中,改变当前工作路径!

但是不知道怎么做。

有人可以帮忙吗?或者给我一个其他的方法?


ps: google了一下change makefile work dir,第一页的所有链接都是无法访问……GFW你赢了
...全文
404 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
木落 2012-02-14
  • 打赏
  • 举报
回复
下面这个是gcc版本,结贴了

CC = gcc
LINK = link

bin = "../bin/program"
obj = ../obj

VPATH+=../bin
VPATH+=$(obj)

CFLAGS = -lm
# LDFLAGS =

src = $(wildcard *.c)
objects = $(patsubst %.c,%.o,$(src))

program : $(objects)
cd $(obj) && $(CC) $(CFLAGS) -o $(bin) $(objects)

$(objects) : $(src)
$(CC) -c $(CFLAGS) -o $(obj)/$@ $(patsubst %.o,%.c,$@)

run : program
$(bin)

clean :
rm $(obj)/*.o
rm $(bin)
木落 2012-02-12
  • 打赏
  • 举报
回复
其实nmake和gnu make相差真的很大,nmake连个vpath都不支持,翻遍了MSDN都找不到。
晾一晾准备结贴了,感谢回答。
木落 2012-02-12
  • 打赏
  • 举报
回复
最后还是自己解决了。最后发现是cl的-Fo选项指定输出路径。

不过也抛弃了nmake,自己修改编译了一下gnu make,改进了对msvc的支持,具体可以看
http://forum.ubuntu.org.cn/viewtopic.php?f=70&t=361781

下面是个简单的makefile,符合我上面列出那个目录结构,Windows下应该改改就能用吧

CC = cl.exe
LINK = link.exe

bin = "../bin/program.exe"
obj = ../obj

vpath+=../bin
vpath %.obj $(obj)

CFLAGS = -W3 -D "UNICODE" -D "_UNICODE" -O2 -Oi -GL -MD -Fo$(obj)/

LDFLAGS = -INCREMENTAL:NO -OPT:REF -OPT:ICF -LTCG kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

objects = $(patsubst %.c,%.obj,$(wildcard *.c))

program.exe : $(objects)
cd $(obj) && $(LINK) -OUT:$(bin) $(LDFLAGS) $(objects)

run : $(bin)
if exist $(bin) $(bin)

clean :
del $(bin)
cd $(obj) && del *.obj
djd_ustc 2012-01-29
  • 打赏
  • 举报
回复
还有,对makefile本身的语法和语义而言,对不同平台比如window和linux是无差别的,有差别的是不同平台下的编译器的名称和选项不同而言,比如gcc和c1。
djd_ustc 2012-01-29
  • 打赏
  • 举报
回复
1.其实这个问题很简单,你干嘛非要cl指定obj文件路径的这么一个选项?我们写程序应该根据问题灵活调整自己的实现方法。根据你的目录结构
Project
- bin
- src [Makefile在这里]
- obj


和要求,可以修改你的makefile文件,假定当前路径是makefile所在路劲,如下
bin = "program.exe"
objects = ../obj/main.o

$(bin) : $(objects)
$(CC) -o $(bin) $(objects)

$(objects) : main.c
$(CC) -c main.c

这样目标文件就都生成到../obj这个目录里面。
如果还想写的更通用写可以把源文件写成
src = main.c (以及其他要编译的源文件*.c)
然后编译时调用$(CC) -c $(SRCS)
从你写的makefile来看还处于入门阶段,要把makefile写的更通用灵活,你要多去学下高级点的用法,编译参数用$(CFLAG), 链接参数$(LDFLAGS)来指定相应值。
如果你想写一个很通用的makefile,那么你需要了解makefiel里面的目标文件和依赖文件的意思以及用法,格式,基本功要扎实才能以一应万变


2. vc的警告有很多,其中包括很多xxx已经被废弃,并将在将来的版本中移除的warnings,你大可不必在意这类警告,如果你不想看到这类警告,可以加入_CRT_SECURE_NO_WARNINGS之类的宏在vc编译器的预定义里面

木落 2012-01-26
  • 打赏
  • 举报
回复
另外微软的cl中选项-o竟然提示:
cl: 命令行 warning D9035 :“o”选项已否决,并将在将来的版本中移除

卧了个槽你这究竟是想闹哪样……
连个makefile都想要尽量和linux不一样吗

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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