在Windows nmake

时间:2015-05-25 05:41:23

标签: c makefile subdirectory nmake object-files

我正在使用 nmake 来编译使用makefile的程序。我正在尝试将obj (。o)文件放在与 C 文件不同的目录中。这是makefile:

!IFDEF DEBUG
COPT = $(CFLAGS_LIB) $(CDEBUGFLAG) $(LIB_OPTION)
AOPT = $(AFLAGS_LIB) $(ADEBUGFLAG) $(LIB_OPTION)
!ELSE
COPT = $(CFLAGS_LIB) $(CNODBGFLAG) $(LIB_OPTION)
AOPT = $(AFLAGS_LIB) $(ANODBGFLAG) $(LIB_OPTION)
!ENDIF

#################### Collect build files #####################################

CORE_HDRS =           \
    i_core.h          \
    i_cver.h          \
    i_target.h        \
    i_subbus.h        \
    v_core.h          \
    v_ioctl.h         \
    v_subbus.h        \
    v_target.h        \
    volcano6.h

CORE_OBJS =           \
    $(OBJPATH)/v_activable.$(O) \
    v_busoff_int.$(O) \
    v_c_act.$(O)  \
    v_c_con.$(O)  \
    v_c_dis.$(O)  \
    v_c_ini.$(O)  \

查看 CORE_OBJS 我在第一个目标文件中使用 $(OBJDIR),而在休息时没有前缀。 问题是 $(OBJPATH)/ v_activable。$(O)根本就没有编译。编译其余文件时,.o文件与.c文件放在同一目录中。 这是编译代码的代码 makefile 部分。

OBJS = $(CORE_OBJS)


all: __prebuild__ __library__ __postbuild__

__prebuild__:
    @echo ----------------------------------------------------------------
    @echo "********************* Build started ****************************"

__dispopts__:
    @echo '*** Compiler: $(CC)'
    @echo "*** Compiler options: $(COPT)"
    @echo "*** Assembler options: $(AOPT)"
    @echo '*** Archiver: $(AR)'
    @echo "*** Archiver options: $(ARFLAGS)"
    @echo ----------------------------------------------------------------
    @echo "******************** Code generation ***************************"

__postbuild__:
    @echo ----------------------------------------------------------------
    @echo "********************* Build finished ***************************"

__library__: __dispopts__ $(OBJS)
    @echo ----------------------------------------------------------------
    @echo "******************** Creating library **************************"
    -@$(AR) $(ARFLAGS)
#################### Inference rules #########################################

.c.$(O):
    @echo Compiling $<
    @$(CC) $(COPT) $<

.$(S).$(O):
    @echo Assembling $<
    @$(AS) $(AOPT) $<

任何人都可以看到并告诉我究竟是什么问题。我试过了规则:

$(OBJPATH)/%.o : $(SRC_DIR)/%.c

但是nmake不承认这条规则。 这是编译器选项

CFLAGS_LIB = -D__FAR_DATA -DUSE_LARGE_IMMEDIATE_FRAME_MASK -CpuHCS12X -Cc -Mb -Wpd -F2 -Rpt -Ot -Onu -Onf -Ol0 -OnB -Onbt -Onca -Oncn -One -OnP -Ont $(SUPPRESSIONS)

CNODBGFLAG = -NoDebugInfo -NoPath


COPT = $(CFLAGS_LIB) $(CNODBGFLAG)

1 个答案:

答案 0 :(得分:0)

我没有The Diab或CGT编译器工具,因此无法测试我的建议,但很明显你的makefile没有使用correct options来重定向目标文件。

我假设宏OBJPATH是您希望编译器将对象发送到的地方。

如果是这种情况,那么您需要将其添加到每个目标文件的名称中,如下所示:

CORE_OBJS =           \
    $(OBJPATH)\v_activable.$(O) \
    $(OBJPATH)\v_busoff_int.$(O) \
    $(OBJPATH)\v_c_act.$(O)  \
    $(OBJPATH)\v_c_con.$(O)  \
    $(OBJPATH)\v_c_dis.$(O)  \
    $(OBJPATH)\v_c_ini.$(O)  

请注意,我们将\符号用于两个不同的目的。这在Microsoft documentation

中注明

必须更改的下一部分是用于将对象重定向到所需位置的编译器标志。这可以在这里完成:

COPT = $(CFLAGS_LIB) $(CNODBGFLAG) -c -o $@

这是使用target macros as shown in the documentation

对于CGT compiler the options are expressed as --out=,规则是:

COPT = $(CFLAGS_LIB) $(CNODBGFLAG) --compile-only --out=$@

不应该为编译添加进一步的规则,因为它已经在这里处理:

.c.$(O):
        @echo Compiling $<
        @$(CC) $(COPT) $<

但是,这需要修改为add the directories where the files reside。最好的来源是this answer。因此,应将其修改为:

{$(SRC_DIR)}.c{$(OBJPATH)}.$(O):
        @echo Compiling $<
        @$(CC) $(COPT) $<

最后,just in case your suffix $(O) is different to the standards recognised by nmake confirm the suffixes with the directive可能是明智的:

.SUFFIXES: .c .$(O)

所以你添加了这条规则:

$(OBJPATH)/%.o : $(SRC_DIR)/%.c

通过使用错误的路径并覆盖现有规则使情况更糟,因此应删除。

我现在已经在makefile中对此进行了测试,以防我忽略了某些内容,并且它对我的测试文件起作用。我的makefile版本被简化,因为我没有使用汇编程序,但它确实证明了它可以根据需要维护不同目录中的源和对象。需要进行更多更改,以通过使用链接器的适当选项将对象链接到库中。我使用gcc来模拟这个:

!IFDEF DEBUG
COPT = $(CFLAGS_LIB) $(CDEBUGFLAG) $(LIB_OPTION) 
AOPT = $(AFLAGS_LIB) $(ADEBUGFLAG) $(LIB_OPTION) 
!ELSE
COPT = $(CFLAGS_LIB) $(CNODBGFLAG) $(LIB_OPTION)
AOPT = $(AFLAGS_LIB) $(ANODBGFLAG) $(LIB_OPTION) 
!ENDIF

#################### Collect build files #####################################

# Set macro for object file type
O=o
OBJPATH=obj
SRC=src
AR=gcc
ARFLAGS=-o library.exe $(OBJS)     

CORE_OBJS =           \
    $(OBJPATH)\one.$(O) \
    $(OBJPATH)\two.$(O) 

#append flag for directing object to their directory

COPT = $(COPT) -c -o $@

OBJS = $(CORE_OBJS)

.SUFFIXES: .c .$(O)


all: __prebuild__ __library__ __postbuild__

__prebuild__:
    @echo ----------------------------------------------------------------
    @echo "********************* Build started ****************************"

__dispopts__:
    @echo '*** Compiler: $(CC)'
    @echo "*** Compiler options: $(COPT)"
    @echo "*** Assembler options: $(AOPT)"
    @echo '*** Archiver: $(AR)'
    @echo "*** Archiver options: $(ARFLAGS)"
    @echo ----------------------------------------------------------------
    @echo "******************** Code generation ***************************"

__postbuild__:
    @echo ----------------------------------------------------------------
    @echo "********************* Build finished ***************************"

__library__: __dispopts__ $(OBJS)
    @echo ----------------------------------------------------------------
    @echo "******************** Creating library **************************"
    -@$(AR) $(ARFLAGS) 
#################### Inference rules #########################################



{src}.c{$(OBJPATH)}.$(O):
    @echo Compiling $(CC) $(COPT) $<
    @$(CC) $(COPT) $<

输出显示构建和链接正常工作:

C:\Users\Brian>nmake /nologo /f Makefile
----------------------------------------------------------------
"********************* Build started ****************************"
'*** Compiler: gcc'
"*** Compiler options:    -c -o __dispopts__"
"*** Assembler options:   "
'*** Archiver: gcc'
"*** Archiver options: -o library.exe obj\one.o  obj\two.o"
----------------------------------------------------------------
"******************** Code generation ***************************"
Compiling gcc -c -o obj\one.o src\one.c
Compiling gcc -c -o obj\two.o src\two.c
----------------------------------------------------------------
"******************** Creating library **************************"
----------------------------------------------------------------
"********************* Build finished ***************************"