将nmake Makefile修改为将目标文件放置在单独的目录中。

7
我把所有源文件放在Source文件夹中,makefile在Makefile文件夹中,我希望所有目标文件都放在Objects文件夹中。这是一个C项目。这三个文件夹都在名为Project的文件夹中。
Project文件夹包含: Source Makefile Objects
我正在尝试找出一种方法来让makefile从Source文件夹编译源代码,我已经尝试过使用:
...
SOURCE_DIR=..\Source
OUTPUT_DIR=..\Objects
.c.obj:
    $(CC) $(SOURCE_DIR)\$*.c /Fo$(OUTPUT_DIR)\$*.obj
...  

但是这并没有起作用,我最终收到了一个错误信息,说不知道如何创建myfile.obj文件。


请添加指定makefile应该构建什么部分的代码。 - Bahbar
4个回答

6

试试这个:

SOURCE_DIR=..\Source
OUTPUT_DIR=..\Objects
{$(SOURCE_DIR)}.c{$(OUTPUT_DIR)}.obj:
    $(CC) $* /Fo$<

根据这里的说明


1

您应该添加目标,将当前目录更改为要生成目标文件的目录。以下是示例nmake Makefile文件。在示例中,nmake从当前目录编译a.c b.c,并将objs $(OBJ_FILES_DIR)目录中的文件和一个SOME_STATIC.LIB文件生成到$(OUTDIR)目录中。

# commmand to launch Makefile
nmake OBJ_FILES_DIR=my_obj_dir OUTDIR=my_lib_dir

# Makefile
STATICLIB = SOME_STATIC.LIB
OBJS = a.obj b.obj # objs in lib
O = $(OBJ_FILES_DIR)
S = $(MAKEDIR)  # remember source dir where a.c b.c reside and current    dir from which nmake launched.

.PHONY: $(STATICLIB)
.PHONY: CHDIR

$(STATICLIB): CHDIR $(OUTDIR)$(STATICLIB) # 

CHDIR:
    -md $(O) 
    cd $(O)

all: $(STATICLIB) 

$(OUTDIR)$(STATICLIB): $(OBJS)
    $(AR) $(ARFLAGS) -out:$@ $(OBJS)

{$(S)}.c.obj::
    $(CC) $(WFLAGS) $(CFLAGS) -c $<

0
如果它字面上是说“不知道如何制作myfile.obj”,而不是“不知道如何制作..\Objects\myfile.obj”,那么你的问题就在别处——makefile中的某些内容正在要求当前目录中的一个对象文件。
需要myfile.obj来构建的规则是什么?我猜在那个规则中,你没有将“$(OUTPUT_DIR)\myfile.obj”指定为依赖项。

0
如果您正在使用Visual Studio,有时会收到以下错误消息:

“不知道如何制作'.obj'”

我通过打开'Makefile'并取消注释在“取消编译时,Visual Studio 2010输出32位二进制文件”的注释下面的行来解决了这个问题。找到与您的Visual Studio版本和体系结构(32位/64位)相对应的注释,并取消注释其下面的行!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接