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

我还尝试-march=x86-64按照此答案文件中所述添加开关,该文件是为 i386 构建的,它不是在 Mac OSX 10.6 上为 iOS 4.2 编译 OpenCV2.2 时链接的体系结构(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. 修改 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 宏(因此您可以省略它们而不会给您自己造成问题),但它们显示了当您在链接时确实需要一些库时您可以如何进行。

对于我自己的 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 位编译。)

于 2012-04-17T01:35:10.950 回答
1

当我不小心在存档中包含一个 .h 文件时,我遇到了这个问题......

于 2014-04-17T12:33:56.387 回答
0

就我而言, -M 选项造成了这个问题。我将此选项添加到项目依赖项中,但不知何故它导致了问题。

于 2013-08-06T15:01:57.527 回答