2014-01-28 1 views
0

Я пытаюсь собрать небольшую новичковую программу на ассемблере, состоящую из двух asm-файлов. Я мог бы создать один файл, но я хотел попробовать вызвать процедуру, которая находится в другом файле.
Вот мой Makefile:«nasm: ошибка: более одного входного файла указано» при компиляции двух файлов asm

NAME  = formatter 

SRCS  = formatter.asm clearstring.asm 

OBJS  = $(SRCS:.asm=.o)` 

NASM  = nasm 
NASMFLAGS = -f elf64 -F dwarf 

LD  = ld 

RM  = rm -f 

all:  $(NAME) 

$(NAME): $(OBJS) 
    $(LD) $(OBJS) -o $(NAME) 

#(1): 
# formatter.o: formatter.asm 
# $(NASM) -o formatter.o formatter.asm $(NASMFLAGS) 
# clearstring.o: clearstring.asm 
# $(NASM) -o clearstring.o clearstring.asm $(NASMFLAGS) 

#(2): 
$(OBJS): $(SRCS) 
    $(NASM) -o $(OBJS) $(SRCS) $(NASMFLAGS) 

При использовании кода под комментариями (1), все работает хорошо, но когда я использую компактный код (2), make дает мне, что:

nasm -o formatter.o clearstring.o formatter.asm clearstring.asm -f elf64 -F dwarf 
nasm: error: more than one input file specified 
nasm: error: more than one input file specified 
type `nasm -h' for help 
make: *** [formatter.o] Error 1 

Я понимаю, что собрать шаг не правильно, но я не могу сделать это сделать:

nasm -o formatter.o formatter.asm -f elf64 -F dwarf 
nasm -o clearstring.o clearstring.asm -f elf64 -F dwarf 

Я надеюсь, что я достаточно ясно для моего первого дия stion на этом сайте.
Не могли бы вы помочь мне?

+1

Я не понимаю вопроса. Метод, который вы прокомментировали как (1), - это правильный способ сделать это. Вы говорите, что все работает хорошо, когда вы его используете. Так в чем проблема с его использованием? – MadScientist

+0

Альтернативой является один файл сборки, чтобы «% include» другой. Например, для чистой сборки у меня обычно есть файл «0index.asm», который включает в себя все, поэтому мне не нужно беспокоиться о make (и проверять, были ли файлы изменены и запускать Nasm-процесс N количество раз, и связывание , а также..). Это быстрее и легче забыть все это ... :-) – Brendan

+0

@MadScientist: Метод (1) действительно работает, но если у меня есть больше, чем несколько файлов для компиляции, может быть немного утомительно писать и читать , Брендан: Спасибо за это, я немного поработал над твоим способом, и это интересно. Я попробую это –

ответ

1

Правило, как это должно сделать трюк:

%.o: %.asm 
    $(NASM) $(NASMFLAGS) -o [email protected] $< 

[email protected] и $< будет расширяться с именами мишени и (во-первых, и в нашем случае, только) входного файла, соответственно.

+0

Спасибо @Michael это правило делает именно то, что я хотел! Я до сих пор не понимаю, почему использование переменных $ (SRCS) и $ (OBJS) не работает. –

+0

. Вы должны пометить ответ как правильный, щелкнув галочку рядом с ним, если он решил вашу проблему. – MadScientist

+1

Причина, по которой это не работает, заключается в том, что именно так определяется программа 'nasm': она принимает один исходный файл как входной файл и записывает один объектный файл в качестве вывода. Поэтому, когда вы вызываете его с несколькими входными файлами и несколькими выходными файлами, он терпит неудачу. Это не имеет никакого отношения к 'make'. Может быть, есть программы, которые используют несколько входов и выходов в одной командной строке, и они будут работать. Но это не так, как работает «nasm». – MadScientist

Смежные вопросы