我正在使用 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)
答案 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 ***************************"