Как я могу скомпилировать 32-разрядную программу, используя makefile

#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 правила имеют совершенно неправильный вызов gcc

3. @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 рекомендует делать все немного по-другому, но это все равно должно работать.