8

OSX Lion にビルド ファイルがあります

VPATH = src include
CFLAGS ="-I include -std=gnu99"

hello: hello.o
    gcc $^ -o $@

hello.o: hello.h hello.c
    gcc $(CFLAGS) -c $< -o $@

しかし、このmakeファイルを実行しようとすると、次のエラーが発生します

    ld: warning: ignoring file hello.o, 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

フラグを使用してみまし-arch x86_64たが、それでも同じエラーが発生します。

archコマンドを実行すると、次のようになりますi386

uname -a私に言います:Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64 x86_64

また、Mac OSX 10.6 で iOS 4.2 用の OpenCV2.2 をコンパイルしているときに、リンクされているアーキテクチャ (x86_64) ではない i386 用にビルドさ-march=x86-64れたこの応答ファイルで説明されているように、スイッチを追加しようとしましたが、うまくいきませんでした。

コマンドラインからの出力は次のとおりです。

gcc -I include -std=gnu99 -m64  -c include/hello.h -o hello.o  
gcc -I include -std=gnu99 -m64  hello.o -o hello
ld: warning: ignoring file hello.o, 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
make: *** [hello] Error 1
4

3 に答える 3

4
  1. すべてのオブジェクト ファイルを削除します。
  2. 次のようにメイクファイルを修正します。

    VPATH   = src include
    CFLAGS  = -I include -std=gnu99 -m64
    CC      = gcc
    LDLIBS  =
    LDFLAGS =
    
    hello: hello.o
        $(CC) $(CFLAGS) $^ -o $@
    
    hello.o: hello.c hello.h
        $(CC) $(CFLAGS) -c $< -o $@ $(LDFLAGS) $(LDLIBS)
    

コマンドラインのすべてをマクロ化したことに注意してください。CFLAGS はすべてのコンパイルで使用されます。それらは二重引用符で囲まれていません。この-m64オプションは 64 ビット ビルドを要求します。必要ではありませんが、明示的にします。LDFLAGS または LDLIBS マクロはまだ必要ありませんが (問題を起こさずに省略できます)、リンク時にいくつかのライブラリが必要な場合にどのように進めるかを示しています。

私自身のメイクファイルについては、次のようなことを行います。

IFLAGS = -Iinclude
WFLAG1 = -Wall
WFLAG2 = -Werror
WFLAG3 = -Wextra
WFLAGS = $(WFLAG1) $(WFLAG2) $(WFLAG3)
OFLAGS = -g -O3
SFLAG1 = -std=c99
SFLAG2 = -m64
SFLAGS = $(SFLAG1) $(SFLAG2)
DFLAGS = # -Doptions
UFLAGS = # Set on make command line only
CFLAGS = $(SFLAGS) $(DFLAGS) $(IFLAGS) $(OFLAGS) $(WFLAGS) $(UFLAGS)

そうすれば、コマンド ラインで C コンパイラの任意の引数を調整できます。たとえば、32 ビット ビルドを実行するには、次のコマンドを実行します。

make SFLAG2=-m32

など。マイナス面は、どのxFLAGnオプションがどれに影響するか思い出せないことです。ただし、makefile をざっと見てみると、これが修正され、makefile をまったく変更せずにコンパイルを変更できます。

(私はまたCC="gcc -m64"、他の人のソフトウェアで 64 ビットのコンパイルを強制するためによく使用します。)

于 2012-04-17T01:35:10.950 に答える
0

私の場合、 -M オプションがこの問題を引き起こしていました。このオプションをプロジェクトの依存関係に追加しましたが、どういうわけか問題が発生していました。

于 2013-08-06T15:01:57.527 に答える