Формат файла не распознан;рассматривая как компоновщик сценария с использованием GCC - PullRequest
4 голосов
/ 07 апреля 2011

Я довольно новичок в Makefiles и пытаюсь собрать исполняемый файл из 3-х файлов file1.c, file2.c и file1.h в исполняемый файл exFile.Вот что я получил:

all: exFile
exFile: file1.o file2.o 
    gcc -Wall -g -m32 repeat.o show.o -o repeat

file1.o: file1.c file1.h
    gcc -Wall -g -m32 -S file1.c -o file1.o

file2.o: file2.c 
    gcc -Wall -g -m32 -S file2.c -o file2.o

Я искал в сети файлы makefile в этом формате, но я пришел с пустыми руками, поэтому мне стало интересно, может ли кто-нибудь помочь.Когда он пытается скомпилировать, я получаю:

usr/bin/ld:file1.o:1: file format not recognized; treating as linker script

Я скомпилировал программы, используя файлы сборки, но я не уверен, что делать с файлами c или файлом file1.h.file1.c включает file1.h, поэтому я должен связать их (я думаю?).Будем благодарны за любые предложения или ссылки на ссылки

Ответы [ 2 ]

6 голосов
/ 07 апреля 2011

У вас две проблемы с командной строкой gcc. Во-первых, вы указываете флаг -S, который заставляет gcc выдавать ассемблерный код, а не объектный код. Во-вторых, вам не хватает флага -c, который говорит gcc скомпилировать файл в объектный файл, но не связывать его. Если вы просто удалите -S и ничего не измените, вы получите исполняемую программу с именем file1.o и другую с именем file2.o вместо двух объектных файлов.

Помимо этих ошибок, вы можете упростить ваш make-файл с помощью шаблонных правил. Я предлагаю вам попробовать следующее:

all: exFile
exFile: file1.o file2.o 
    gcc -Wall -g -m32 $^ -o $@

%.o: %.c
    gcc -Wall -g -m32 -c $< -o $@

file1.o: file1.h

Или, как указывает EmployedRussian, вы можете пойти с чем-то еще более минимальным, которое использует больше встроенных функций GNU:

CC=gcc
CFLAGS=-Wall -g -m32

all: exFile

exFile: file1.o file2.o 
        $(LINK.c) $^ -o $@

file1.o: file1.h
0 голосов
/ 07 апреля 2011

Переключатель -S в gcc указывает выходному ассемблеру:

gcc -Wall -g -m32 -S file1.c -o file1.o

Помещает ассемблер в file1.o, но вы, вероятно, хотите скомпилировать file1.c в объектный код:

gcc -Wall -g -m32 file1.c -o file1.o

Когда компоновщик получает ваш file1.o, он сбит с толку, потому что file1.o является ассемблером, когда компоновщик ожидает объектный код, поэтому ваша ошибка.

Так что избавьтесь от -S переключателей для file1.o и file2.o.

...