プリコンパイル済みヘッダとOSX上で普遍的なオブジェクトをコンパイルします

StackOverflow https://stackoverflow.com/questions/1757509

質問

私たちは私たちのプロジェクトのための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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top