Предварительно скомпилированные заголовки и компиляция универсальных объектов в 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, но я бы предпочел воспользоваться возможностью создавать их одновременно, и мне не пришлось бы возиться с различными конфигурациями сборки.
3 ответа
Я просто натолкнулся на те же вопросы и проследовал по ссылке, предоставленной @lucas, поэтому решил, что предоставлю то, что нашел здесь.
Прежде всего, если вы переносите свой код gcc с Linux на MacOS, версия gcc, предоставляемая яблоком, неправильно определяет расширение файла.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
Ваша проблема не в архитектуре. Оба терпят неудачу
Проблема в том, что вы пытаетесь создать исполняемый файл без основной функции.
Поскольку имя файла - commonlib.c, я подозреваю, что вы хотите создать библиотеку, если это так, запустите проект с шаблоном библиотеки в XCode.
Это может работать для вас
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)