Вопрос по gcc, macos – файл был создан для неподдерживаемого формата файла, который не связан с архитектурой (x86_64)

6

У меня есть файл сборки на 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

Ваш Ответ

2   ответа
3
Remove all the object files.

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$<Error: User Rate Limit Exceeded$^.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded.oError: User Rate Limit Exceededgcc -o hello hello.cError: User Rate Limit Exceededhello.cError: User Rate Limit Exceededhello.h?
Error: User Rate Limit Exceededgcc -I include -std=gnu99 -m64 -c include/hello.h -o hello.oError: User Rate Limit Exceededhello.cError: User Rate Limit Exceeded$^Error: User Rate Limit Exceeded$*Error: User Rate Limit Exceeded$<Error: User Rate Limit Exceededfile hello.oError: User Rate Limit Exceededhello.cError: User Rate Limit Exceededhello.hError: User Rate Limit Exceededhello.o.
0

ависимости проекта, но почему-то это вызывало проблемы.

Error: User Rate Limit Exceeded-M.

Похожие вопросы