8

プロジェクトでは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)

編集:MarkがXCodeに従って指摘したように、プリコンパイル済みヘッダーはアーキテクチャごとに個別にビルドする必要があるため、ユニバーサルオブジェクトをビルドするときにgccに正しいプリコンパイル済みヘッダーを使用させる方法があるかどうかが私の質問です。

XCodeのように各アーキテクチャを完全に個別にビルドできることは理解していますが、同時にビルドする可能性を利用して、さまざまなビルド構成をいじくり回す必要はありません。

4

3 に答える 3

4

あなたの問題はアーキテクチャではありません。両方とも失敗しています

問題は、main関数なしで実行可能ファイルをビルドしようとしていることです。

ファイル名はcommonlib.cなので、ライブラリをビルドしたい場合は、XCodeのライブラリテンプレートを使用してプロジェクトを開始します。

于 2009-11-18T17:59:29.303 に答える
3

同じ質問に出くわし、@ lucasから提供されたリンクをフォローアップしたので、ここで見つけたものを提供しようと思いました。

まず、gccコードをLinuxからMacOSに移植する場合、Appleが提供するバージョンの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

別の回答で述べたように、-xgccがコンパイルしているファイルのタイプを確実に認識できるように引数を指定するのが最善です。

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
于 2012-01-13T15:41:22.763 に答える
-1

これはあなたのために働くかもしれません

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)
于 2019-02-20T10:50:14.733 に答える