Strange linking behavior on OS X

The final linking for my program (d2x) always fails on OS X, with this little gem:

gcc -I ./arch/linux/include -I/sw/include -I/sw/include/SDL -D_THREAD_SAFE
-F/System/Library/Frameworks/Carbon.framework
-F/System/Library/Frameworks/Cocoa.framework -pipe -g -Wall -Werror -o
d2x-sdl main/libmain.a 3d/lib3d.a 2d/lib2d.a arch/linux/libarch_linux.a
arch/sdl/libarch_sdl.a libmve/libmve.a mem/libmem.a cfile/libcfile.a
iff/libiff.a texmap/libtexmap.a misc/libmisc.a maths/libmaths.a -lm -lSDL_image
-L/sw/lib -lSDLmain -lSDL -framework OpenGL -framework AGL -framework IOKit
-framework Carbon -framework Cocoa
/usr/bin/ld: Undefined symbols:
_SDL_main

My declaration of main looks like this:
int main(int argc, char *argv[])

and SDL.h is included.

I think libmain.a looks fine:
nm main/libmain.a | grep SDL_main
000006b8 T _SDL_main

But if I link “manually” like so:
gcc -I ./arch/linux/include -I/sw/include -I/sw/include/SDL -D_THREAD_SAFE
-F/System/Library/Frameworks/Carbon.framework
-F/System/Library/Frameworks/Cocoa.framework -pipe -g -Wall -Werror -o
d2x-sdl find . -name "*.o" -lm -lSDL_image -L/sw/lib -lSDLmain -lSDL
-framework OpenGL -framework AGL -framework IOKit -framework Carbon -framework
Cocoa

It works! Can anybody help me out here?

-brad

Bradley Bell wrote:

The final linking for my program (d2x) always fails on OS X, with this little gem:

gcc -I ./arch/linux/include -I/sw/include -I/sw/include/SDL -D_THREAD_SAFE
-F/System/Library/Frameworks/Carbon.framework
-F/System/Library/Frameworks/Cocoa.framework -pipe -g -Wall -Werror -o
d2x-sdl main/libmain.a 3d/lib3d.a 2d/lib2d.a arch/linux/libarch_linux.a
arch/sdl/libarch_sdl.a libmve/libmve.a mem/libmem.a cfile/libcfile.a
iff/libiff.a texmap/libtexmap.a misc/libmisc.a maths/libmaths.a -lm -lSDL_image
-L/sw/lib -lSDLmain -lSDL -framework OpenGL -framework AGL -framework IOKit
-framework Carbon -framework Cocoa

You are linking .a libraries, maybe you have dependency problems since
libmain.a is the first object.

Try to place libmain.a in the end of the link line or to add “-Lmain
-lmain”.

Bye,
Gabry

The final linking for my program (d2x) always fails on OS X, with this little gem:

gcc -I ./arch/linux/include -I/sw/include -I/sw/include/SDL -D_THREAD_SAFE
-F/System/Library/Frameworks/Carbon.framework
-F/System/Library/Frameworks/Cocoa.framework -pipe -g -Wall -Werror -o
d2x-sdl main/libmain.a 3d/lib3d.a 2d/lib2d.a arch/linux/libarch_linux.a
arch/sdl/libarch_sdl.a libmve/libmve.a mem/libmem.a cfile/libcfile.a
iff/libiff.a texmap/libtexmap.a misc/libmisc.a maths/libmaths.a -lm -lSDL_image
-L/sw/lib -lSDLmain -lSDL -framework OpenGL -framework AGL -framework IOKit
-framework Carbon -framework Cocoa
/usr/bin/ld: Undefined symbols:
_SDL_main

When you’re linking entire .a archives into your application on MacOS X,
you need to specify the -all_load option to the linker. (Check spelling)

See ya!
-Sam Lantinga, Software Engineer, Blizzard Entertainment

Quoting Sam Lantinga :

The final linking for my program (d2x) always fails on OS X, with this

When you’re linking entire .a archives into your application on MacOS X,
you need to specify the -all_load option to the linker. (Check spelling)

That fixes it! Thanks. I’m guessing this is basically a workaround for
archives with circular dependencies, then?

-brad