2015-05-25 10 views
0

Я использую nmake, чтобы скомпилировать мою программу, которая использует make-файл. Я пытаюсь загрузить obj (.o) файлы, которые будут размещены в отдельной директории, чем C файлов. Вот Makefile:Makefile, который генерирует файлы obj в подкаталоге в Windows nmake

!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 **************************" 
    [email protected]$(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

NMAKE обычно используется на платформе Window. На пути к файлам Windows используйте символ «\» и параметры команды используйте символ «/». В Linux и Mac путь к файлу использует символ «/», а опции обычно используют символ «-». Я вижу, что вы используете символ «/» в пути. Это не нормально для NMAKE. Возможно, это твоя проблема? –

+0

Спасибо за ответ. Я использовал оба «/», «\». Но проблема все еще существует. Фактически, когда я указываю некоторый путь для файлов obj, компилятор ожидает, что исходный файл будет в том же каталоге. Но я хочу исходный файл и объектный файл в разных каталогах. – cool

+0

Какой компилятор и ассемблер вы используете? Команды компиляции не изменяют папки объектов. Чтобы изменить его, нам нужно знать, какие компиляторы. Это GCC, CL или что? –

ответ

0

Я не имею Diab или ВКТ инструменты компилятора, поэтому не могу проверить мои предложения, но ясно, что ваш 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 [email protected] 

Это использует target macros as shown in the documentation.

Для CGT compiler the options are expressed as --out= и правилом будет:

COPT = $(CFLAGS_LIB) $(CNODBGFLAG) --compile-only [email protected] 

Один не нужно добавить еще правило для компиляции, как он обрабатывается уже здесь:

.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 

сделал это хуже как по используя неправильный путь и переопределяя существующее правило, и поэтому его следует удалить.

Теперь я проверил это в make-файле, на всякий случай я что-то упустил, и он работает для меня в моих тестовых файлах. Моя версия make-файла упрощена, так как я не использую ассемблер, но он демонстрирует, что он должен поддерживать источники и объекты в разных каталогах по мере необходимости. Необходимо будет внести дополнительные изменения, чтобы связать объекты в библиотеке, используя соответствующие параметры для компоновщика. Я использовал 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 [email protected] 

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 **************************" 
    [email protected]$(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 ***************************" 
+0

Hi Brian, Я пробовал это снова, но проблема все еще там. $ (OBJPATH) /%. O: $ (SRC_DIR) /%. C Это правило не работает. Компилятор ожидает, что исходный файл будет в той же папке, что и в объектном файле. И эта проблема не в компиляторе. Как сейчас я изменил компилятор. Теперь я использую «cgt» Code Composer Studio. – cool

+0

@MuhammadImranAfzal Теперь я исправил ответ и включил подробности об использовании компилятора CGT. –

+0

Привет, Брайан, Большое спасибо за ответ. Но у меня все еще есть проблема с этим. Можете ли вы отправить/отправить свою тестовую программу. Может быть, я чего-то не хватает. Благодарим вас за такой обширный и подробный поиск по этой теме. – cool