Мы используем предварительно скомпилированные заголовки с GCC для нашего проекта и строим их следующим образом:

gcc $(CFLAGS) precompiledcommonlib.h

Теперь я создаю проект на OSX 10.6 и пытаюсь использовать отличную функцию построения для всех архитектур одновременно, вот так:

gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c  

Однако, похоже, это не работает для предварительно скомпилированных заголовков:

gcc $(CFLAGS) -arch i386 -arch x86_64 precompiledcommonlib.h
Undefined symbols for architecture i386:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
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
lipo: can't open input file: /var/folders/z1/z1A0sPkqGDyPrZWo9ysVK++++TI/-Tmp-//cc3W2gwd.out (No such file or directory)

Изменить: как указал Марк в соответствии с XCode, предварительно скомпилированный заголовок должен быть построен отдельно для каждой архитектуры, поэтому мой вопрос скорее в том, есть ли способ заставить gcc использовать правильный предварительно скомпилированный заголовок при создании универсальных объектов.

Я понимаю, что могу построить каждую архитектуру полностью отдельно, как это делает XCode, но я бы предпочел воспользоваться возможностью создавать их одновременно и не возиться с разными конфигурациями сборки.

8
rasmusb 18 Ноя 2009 в 20:05
Я просто попытался сделать то же самое, и, насколько я могу судить, вы не можете сгенерировать один файл PCH, давая GCC Apple два флага -arch. Ребята из Qt, кажется, делают что-то странное, чтобы заставить это работать, вы можете проверить это ... qt.gitorious.org/qt/qt/merge_requests/2193
 – 
Lucas
7 Фев 2010 в 20:25

3 ответа

Лучший ответ

Я просто столкнулся с теми же вопросами и ответил по ссылке, предоставленной @lucas, поэтому я подумал, что предоставлю то, что нашел здесь.

Прежде всего, обратите внимание: если вы переносите свой код gcc с Linux на MacOS, версия gcc, предоставляемая Apple, неправильно определяет расширение файла .hpp.

mac:openstudio lefticus$ g++ test.hpp
ld: warning: ignoring file test.hpp, 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

Как упоминалось в другом ответе, лучше всего указать аргумент -x, чтобы убедиться, что gcc знает, какой тип файла вы компилируете.

g++ -x c++-header test.hpp

Это создает ожидаемый test.hpp.gch.

Вы можете указать любую архитектуру в командной строке, и gch будет правильно строить

g++ -x c++-header test.hpp -arch i386

Или

g++ -x c++-header test.hpp -arch x86_64

Если вы предоставляете более одной архитектуры, вы получите сообщение об ошибке, указанное на плакате.

mac:openstudio lefticus$ g++ -xc++-header test.hpp -arch i386 -arch x86_64
Undefined symbols for architecture i386:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
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
lipo: can't open input file: /var/folders/DM/DMTpbjzHHX08IEqGgEAORE+++TI/-Tmp-//ccDeWigf.out (No such file or directory)

Ключ состоит в том, чтобы скомпилировать нужные вам архитектуры отдельно, а затем использовать аргумент -Xarch_ для загрузки соответствующей архитектуры во время компиляции:

g++ -x c++-header -arch x86_64 x86_64/test.hpp
g++ -x c++-header -arch i386 i386/test.hpp

g++ -arch i386 -arch x86_64 test.cpp -Xarch_i386 -Ii386 -Xarch_x86_64 -Ix86_64
3
lefticus 13 Янв 2012 в 19:41
Отличная находка! Большое спасибо!
 – 
rasmusb
14 Янв 2012 в 19:21

Ваша проблема не в архитектуре. Оба терпят неудачу

Проблема в том, что вы пытаетесь создать исполняемый файл без основной функции.

Поскольку имя файла - commonlib.c, я подозреваю, что вы хотите создать библиотеку, если так начнете проект с шаблона библиотеки в XCode.

4
mmmmmm 18 Ноя 2009 в 20:59
Спасибо, что нашли время. Попробуйте gcc foo.h. Что он выводит? Вы все еще думаете, что я пытаюсь создать исполняемый файл? Поспешный, не говоря уже о том, чтобы ответить совершенно неверно, и покровительственное отношение - не особо очаровательное сочетание.
 – 
rasmusb
19 Ноя 2009 в 01:19
Я перепутал командные строки, извините. Однако сообщения об ошибках и командная строка пытаются создать исполняемый файл. - вот почему ld - это командная строка, выдавая ошибку, я бы все равно установил это в Xcode, чтобы все флаги были правильными. Если бы вы видели, что Apple предварительно компилирует каждый заголовок отдельно для каждой архитектуры, а командная строка включает -x objective-c-header -arch x86_64 Apple docs << a href = "http://developer.apple.com/Mac/ library / documentation / DeveloperTools / gcc-4.0.1 / gcc / Precompiled-Headers.html "rel =" nofollow noreferrer "> developer.apple.com/Mac/library/documentation/DeveloperTools/… > также предлагает -x параметр. и подробности по отдельным архитектурам.
 – 
mmmmmm
19 Ноя 2009 в 15:19
Хороший звонок. Я получаю эту ошибку, когда создаю проект без основного метода
 – 
surajz
19 Мар 2011 в 19:54

Это может сработать для вас

valid output formats for -f are (`*' denotes default):
  * bin       flat-form binary files (e.g. DOS .COM, .SYS)
    ith       Intel hex
    srec      Motorola S-records
    aout      Linux a.out object files
    aoutb     NetBSD/FreeBSD a.out object files
    coff      COFF (i386) object files (e.g. DJGPP for DOS)
    elf32     ELF32 (i386) object files (e.g. Linux)
    elf64     ELF64 (x86_64) object files (e.g. Linux)
    elfx32    ELFX32 (x86_64) object files (e.g. Linux)
    as86      Linux as86 (bin86 version 0.3) object files
    obj       MS-DOS 16-bit/32-bit OMF object files
    win32     Microsoft Win32 (i386) object files
    win64     Microsoft Win64 (x86-64) object files
    rdf       Relocatable Dynamic Object File Format v2.0
    ieee      IEEE-695 (LADsoft variant) object file format
    macho32   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
    macho64   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
    dbg       Trace of all info passed to output stage
    elf       ELF (short name for ELF32)
    macho     MACHO (short name for MACHO32)
    win       WIN (short name for WIN32)
-1
hakamairi 20 Фев 2019 в 14:20