Предварительно скомпилированные заголовки и компиляция универсальных объектов в OSX

Мы используем предварительно скомпилированные заголовки с 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, но я бы предпочел воспользоваться возможностью построить их одновременно и не возиться с разными конфигурациями сборки.


person rasmusb    schedule 18.11.2009    source источник
comment
Я только что пытался сделать то же самое, и из того, что я могу понять, вы не можете создать один файл PCH, задав Apple GCC два флага -arch. Ребята из Qt, кажется, делают что-то странное, чтобы заставить это работать, вы можете проверить это... qt.gitorious.org/qt/qt/merge_requests/2193   -  person Lucas    schedule 07.02.2010


Ответы (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

or

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
person lefticus    schedule 13.01.2012
comment
Отличная находка! Большое спасибо! - person rasmusb; 14.01.2012

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

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

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

person mmmmmm    schedule 18.11.2009
comment
Спасибо, что уделили время. Попробуйте "gcc foo.h". Что он выводит? Вы все еще думаете, что я пытаюсь создать исполняемый файл? Поспешный, не говоря уже о просто неправильном ответе и покровительственном отношении — не особенно очаровательное сочетание. - person rasmusb; 19.11.2009
comment
Я перепутал командные строки, извините. Однако сообщения об ошибках и командная строка пытаются создать исполняемый файл. - вот почему ld является командной строкой, выдавая ошибку, которую я все равно настроил бы в Xcode, чтобы правильно установить все флаги. Если бы вы знали, вы бы увидели, что Apple предварительно компилирует каждый заголовок отдельно для каждой архитектуры, а командная строка включает -x target-c-header -arch x86_64 Apple docs ‹developer.apple.com/Mac/library/documentation/DeveloperTools/› также предложите - х параметр. и подробные сведения об отдельных архитектурах. - person mmmmmm; 19.11.2009
comment
Хороший звонок. Я получаю эту ошибку, когда создаю проект без основного метода - person surajz; 19.03.2011

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

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)
person Volkan Zulal    schedule 20.02.2019