I have a build file on 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 $@
But when I try and run this make file I get the following error
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
I have tried using the flag -arch x86_64
but still get the same error.
Running the arch
command gives: i386
.
uname -a
tells me: 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
I've also tried to add the switch -march=x86-64
as described in this answer file was built for i386 which is not the architecture being linked (x86_64) while compiling OpenCV2.2 for iOS 4.2 on Mac OSX 10.6 but that hasn't worked for me.
The output from the command line is:
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
Revise the makefile more like:
Note that I've macro-ized everything on the command lines. The CFLAGS are used in all compilations. They are not enclosed in double quotes. The
-m64
option requests a 64-bit build; it shouldn't be necessary, but it makes it explicit. You don't yet need the LDFLAGS or LDLIBS macros (so you could omit them without causing yourself problems), but they show how you might proceed when you do need some libraries at link time.For my own makefiles, I do things like:
That way I can adjust just about any single argument to the C compiler on the command line. For example, to do 32-bit builds, I can run:
Etc. The downside is I can never remember which xFLAGn option affects which. However, a quick look at the makefile rectifies that, and I can change the compilation without modifying the makefile at all.
(I also often use
CC="gcc -m64"
to force 64-bit compilations on other people's software.)In my case, the -M option was creating this issue. I added this option to project dependencies but somehow it was causing issues.
I had this problem when I accidentally included a .h file in an archive...