[解決済み] ファイルがリンク先のアーキテクチャではない、サポートされていないファイル形式でビルドされた (x86_64)
質問
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
また、スイッチを追加してみました。
-march=x86-64
この回答で説明されているように
Mac OSX 10.6 上で iOS 4.2 用の OpenCV2.2 をコンパイルする際、ファイルが i386 用にビルドされましたが、リンクされているアーキテクチャ (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
解決方法は?
- オブジェクトファイルをすべて削除してください。
-
makefileをもっと好きに修正する。
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ビットコンパイルを強制することができます)。
関連
-
[解決済み】Xcode - 'NSUnknownKeyException', reason: ... this class is not key value coding-compliant for the key X" エラーの修正方法とは?
-
[解決済み】Mongod が /data/db フォルダがないと文句を言う問題
-
[解決済み】ターミナルエラー: zsh: 権限が拒否されました: ./startup.sh
-
[解決済み] OSX Mavrerick で mvn コマンドが見つかりません。
-
[解決済み] mongo コマンドが使えない。mac ではコマンドが見つからないと表示される。
-
[解決済み] ターミナルからmvim(MacVim)を実行するには?
-
[解決済み] Sublコマンドが動作しない - コマンドが見つかりません
-
[解決済み] Mac OS X LionのPHP.iniはどこにあるのですか?
-
[解決済み] zshでnpmインストール後にコマンドが見つからない
-
[解決済み] シンボリックリンクを削除する方法を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜこのマージが必要なのか、特に更新された上流をトピックブランチにマージする場合、コミットメッセージを入力してください。
-
[解決済み】SSH -L 接続は成功したが、localhost のポートフォワーディングが機能しない "channel 3: open failed: connect failed: 接続が拒否されました"
-
[解決済み] MacBook Proでefilogin-helperが高CPUで連続稼動【終了しました
-
[解決済み] Mac OS Xのターミナルでcdコマンドを逆引きするにはどうすればよいですか?
-
[解決済み] DYLD: レイジーシンボル
-
[解決済み] Postgres - FATAL: データベースファイルはサーバーと互換性がありません。
-
[解決済み] .ssh/config: "不正な設定オプションです。Mac OS Sierra 10.12.6 で "UseKeychain" が表示される。
-
[解決済み] SSH -L 接続は成功したが、localhost のポート転送が機能しない "channel 3: open failed: connect failed: 接続が拒否されました"
-
[解決済み] なぜ `source ~/.profile` を使い続けないと設定ができないのですか?
-
[解決済み] 特定のパターンに一致するすべてのファイルを再帰的に検索する