Я просто столкнулся с теми же вопросами и получил ссылку @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