【问题标题】:nmake Makefile to Place object files in a separate directorynmake Makefile 将目标文件放在单独的目录中
【发布时间】:2023-03-22 13:15:01
【问题描述】:

我的所有源文件都在 Source 文件夹中,makefile 在 Makefile 文件夹中,我希望所有目标文件都放在 Objects 文件夹中。这是我正在开发的 C 项目。这三个文件夹都在一个名为 Project 的文件夹中。

项目文件夹包含: 资源 生成文件 对象

我试图找出一种方法来让 makefile 从 Source 文件夹编译源代码,我尝试过使用:

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

但这不起作用,我最终收到一条错误消息,同时说不知道如何制作 myfile.obj

【问题讨论】:

  • 请添加指定makefile应该构建的部分。

标签: makefile nmake


【解决方案1】:

试试这个:

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

这里解释:http://msdn.microsoft.com/en-us/library/hk9ztb8x.aspx

【讨论】:

    【解决方案2】:

    您应该添加目标,将当前目录更改为您要制作目标文件的目录。下面是 nmake 示例 Makefile 文件。在示例中,nmake 从当前目录编译 a.c b.c 并放置 objs $(OBJ_FILES_DIR) 目录并在 $(OUTDIR) 目录中构建 SOME_STATIC.LIB。

    # 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 $<
    

    【讨论】:

      【解决方案3】:

      如果它的字面意思是don't know how to make myfile.obj,而不是don't know how to make ..\Objects\myfile.obj,那么你的问题出在其他地方——makefile 中的某些内容要求当前目录中的目标文件。

      需要 myfile.obj 构建的规则是什么?我猜想在该规则中您没有指定 $(OUTPUT_DIR)\myfile.obj 作为依赖项。

      【讨论】:

        【解决方案4】:

        如果您使用的是 Visual Studio,有时您会收到错误消息:

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

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

        【讨论】:

          猜你喜欢
          • 2011-05-05
          • 1970-01-01
          • 2011-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-06
          • 1970-01-01
          相关资源
          最近更新 更多