Вопрос по gcc, macos – файл был создан для неподдерживаемого формата файла, который не связан с архитектурой (x86_64)
У меня есть файл сборки на OSX Lion
VPATH = src include
CFLAGS ="-I include -std=gnu99"
hello: hello.o
gcc $^ -o [email protected]
hello.o: hello.h hello.c
gcc $(CFLAGS) -c $< -o [email protected]
Но когда я пытаюсь запустить этот файл make, я получаю следующую ошибку
ld: warning: ignoring file hello.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Я пытался использовать флаг-arch x86_64
но все равно получаю ту же ошибку.
Запускarch
Команда дает:i386
.
uname -a
говорит мне:Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64 x86_64
Я также пытался добавить переключатель-march=x86-64
как описано в этом ответефайл был создан для i386, который не является связываемой архитектурой (x86_64) при компиляции OpenCV2.2 для iOS 4.2 на Mac OSX 10.6 но это не сработало для меня.
Вывод из командной строки:
gcc -I include -std=gnu99 -m64 -c include/hello.h -o hello.o
gcc -I include -std=gnu99 -m64 hello.o -o hello
ld: warning: ignoring file hello.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [hello] Error 1
VPATH = src include
CFLAGS = -I include -std=gnu99 -m64
CC = gcc
LDLIBS =
LDFLAGS =
hello: hello.o
$(CC) $(CFLAGS) $^ -o [email protected]
hello.o: hello.c hello.h
$(CC) $(CFLAGS) -c $< -o [email protected] $(LDFLAGS) $(LDLIBS)
Обратите внимание, что я макросировал все в командной строке. CFLAGS используются во всех сборниках. Они не заключены в двойные кавычки.-m64
опция запрашивает 64-битную сборку; это не должно быть необходимым, но оно делает это явным. Вам еще не нужны макросы LDFLAGS или LDLIBS (так что вы можете опустить их, не вызывая у себя проблем), но они показывают, как вы можете действовать, когда вам нужны какие-то библиотеки во время компоновки.
Для своих собственных make-файлов я делаю такие вещи, как:
IFLAGS = -Iinclude
WFLAG1 = -Wall
WFLAG2 = -Werror
WFLAG3 = -Wextra
WFLAGS = $(WFLAG1) $(WFLAG2) $(WFLAG3)
OFLAGS = -g -O3
SFLAG1 = -std=c99
SFLAG2 = -m64
SFLAGS = $(SFLAG1) $(SFLAG2)
DFLAGS = # -Doptions
UFLAGS = # Set on make command line only
CFLAGS = $(SFLAGS) $(DFLAGS) $(IFLAGS) $(OFLAGS) $(WFLAGS) $(UFLAGS)
Таким образом, я могу настроить практически любой аргумент для компилятора C в командной строке. Например, для создания 32-битных сборок я могу запустить:
make SFLAG2=-m32
И т.д. Недостатком является то, что я никогда не могу вспомнить, какиеxFLAGn Опция, которая влияет на. Однако быстрый взгляд на make-файл исправляет это, и я могу изменить компиляцию, не изменяя make-файл вообще.
(Я также часто используюCC="gcc -m64"
заставить 64-битные компиляции на чужом программном обеспечении.)
$<
Error: User Rate Limit Exceeded$^
.
.o
Error: User Rate Limit Exceededgcc -o hello hello.c
Error: User Rate Limit Exceededhello.c
Error: User Rate Limit Exceededhello.h
?
gcc -I include -std=gnu99 -m64 -c include/hello.h -o hello.o
Error: User Rate Limit Exceededhello.c
Error: User Rate Limit Exceeded$^
Error: User Rate Limit Exceeded$*
Error: User Rate Limit Exceeded$<
Error: User Rate Limit Exceededfile hello.o
Error: User Rate Limit Exceededhello.c
Error: User Rate Limit Exceededhello.h
Error: User Rate Limit Exceededhello.o
.