#c #c #makefile
#c #c #makefile
Вопрос:
Я пытаюсь создать 3 отдельные программы mem_1.exe , mem_2.exe и mem_3.exe . Мне нужно сделать их 32-разрядными, когда я их компилирую, и сообщение об ошибке, похоже, не отражает то, что я пишу. Ниже приведен мой makefile.
mem_1: memlayout.o mem_1.o
gcc -o mem_1 memlayout.c mem_1.c -ldl -m32
mem_2: memlayout.o mem_2.o
gcc -o mem_2 memlayout.c mem_2.c -m32 -ldl
mem_3: memlayout.o mem_3.o
gcc -o mem_3 memlayout.c mem_3.c -m32 -ldl
mem_1.o: mem_1.c
gcc -c -o mem_1 mem_1.c -m32
mem_2.o: mem_2.c
gcc -c -o mem_2 mem_2.c -m32
mem_3.o: mem_3.c
gcc -c -o mem_3 mem_3.c -m32
memlayout.o: memlayout.c
gcc -c -o memlayout memlayout.c -m32
clean:
rm -f mem_1.o mem_2.o mem_3.o memlayout.o *~
Каждый раз, когда я пытаюсь запустить этот makefile, я получаю это сообщение об ошибке
cc -c -o memlayout.o memlayout.c
cc -c -o mem_1.o mem_1.c
gcc -o mem_1.exe mem_1.o memlayout.o -m32 -ldl
/usr/bin/ld: i386:x86-64 architecture of input file `mem_1.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `memlayout.o' is incompatible with i386 output
Что, похоже, не имеет смысла, поскольку я использую флаг -m32, чтобы сделать его 32-разрядным. Кто-нибудь может объяснить, что я делаю не так?
Комментарии:
1. Как вы можете видеть из выходных данных,
.o
файлы создаются без-m32
2.
mem_1.o
не должноmemlayout.o
быть в качестве зависимости, и аналогично для 2 и 3; и некорректно указывать два.c
файла вgcc -c
строке. Все.o
правила имеют совершенно неправильный вызов gcc3. @M.M Почему это происходит? Почему он не будет использовать мой рецепт для объектных файлов?
4. Вы можете выполнить трассировку,
make --trace
чтобы увидеть, что происходит5. @M.M <встроенный>: обновить цель ‘memlayout. o’ из-за: memlayout.c cc -c -o memlayout.o memlayout.c <встроенный>: цель обновления ‘mem_1.o’ из-за: mem_1.c cc -c -o mem_1.o mem_1.c Моя трассировка показала это. Но я все еще не понимаю, что это не тот рецепт, который я дал. Я понимаю, почему происходит ошибка, учитывая, какие инструкции выполняет make, но я не понимаю, почему он запускает их вместо моих
Ответ №1:
Я бы посоветовал думать о вашем makefile как о коде (поскольку он есть) и следовать стандартным советам, чтобы не повторяться.
Похоже, у вас также немного неправильные флаги. -m32
является флагом компилятора. -ldl
является флагом компоновщика. Если вы собираетесь выполнять сборку для 32 бит, вам нужно указать как компилятору, так и компоновщику создавать 32-разрядные файлы. Нет гарантии, но я думаю, вам нужно что-то в этом общем порядке:
CFLAGS = -m32 LFLAGS = -melf_i386 -ldl mem_1: mem_1.o memlayout.o $(LD) $(LFLAGS) -o mem_1 mem_1.o memlayout.o mem_2: mem_2.o memlayout.o $(LD) $(LFLAGS) -o mem_2 mem_2.o memlayout.o mem_3: mem_3.o memlayout.o $(LD) $(LFLAGS) -o mem_3 mem_3.o memlayout.o # You probably don't really need this--`make` will usually have it built-in: .c.o: $(CC) -c $(CFLAGS)
lt;
Примечание: я старый, так что это своего рода старомодный Makefile. Gnu рекомендует делать все немного по-другому, но это все равно должно работать.