プリコンパイル済みヘッダとOSX上で普遍的なオブジェクトをコンパイルします
-
20-09-2019 - |
質問
私たちは私たちのプロジェクトのための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)
編集: マークは、普遍的なオブジェクトを構築するときにgccが右のプリコンパイル済みヘッダーを使用できるようにするにはどのような方法があるかどうか私の質問はかなりあるので、プリコンパイル済みヘッダーは、各アーキテクチャごとに個別に構築する必要があるXCodeのあたりのように指摘したようます。
私はXCodeのは、それをしないように、各アーキテクチャを完全に分離構築することができますが、私はむしろそれらを同時に構築し、別のビルド構成で周りの混乱に持っていないために可能性の利点を取ることを実現します。
解決
私はちょうど同じ質問に走ったと@lucasによって提供されたリンクを追跡ので、私は私がここに見つけたものを提供するだろうと思っています。
ノートのまず、あなたはアップルが提供するGCCのバージョンが正しく.HPPファイル拡張子を検出しない、MacOSのへのLinuxからあなたのgccのコードを移植する場合ます。
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
別の答えで述べたように、、それはgccはあなたがコンパイルされているファイルの種類を知っていることを確認するために-x
引数を指定するのが最善です。
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
他のヒント
あなたの問題は、アーキテクチャではありません。両方が失敗している。
問題は、主な機能なしで実行可能ファイルを構築しようとしているということです。
ファイル名は、私はあなたがそうXcodeでライブラリテンプレートでプロジェクトを開始した場合、ライブラリを構築したい疑いcommonlib.cある通ります。
これはあなたのために働くかもしれません。
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)