文件是专为未架构被链接不支持的文件格式(x86_64的)(file was built for un

2019-07-29 00:14发布

我对OSX狮子构建文件

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 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在这个答案说明是专为i386的文件,该文件是不是被链接下(x86_64)架构,而在Mac OSX 10.6编译OpenCV2.2为iOS 4.2 ,但是这不是招“T为我工作。

在命令行的输出是:

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

Answer 1:

  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宏,但它们表明,当你需要在链接时一些库可能会如何进行。

对于我自己的makefile,我做这样的事情:

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位编译。)



Answer 2:

我有这个问题时,我意外地包含在存档.h文件中...



Answer 3:

在我的情况,-M选项是创造这一问题。 我添加了这个选项,项目的依赖,但不知何故这是造成问题。



文章来源: file was built for unsupported file format which is not the architecture being linked (x86_64)