[UPDATE: 02/26/2010
As of Xcode 3.x, the -shared argument seems to be working on OS X to create shared objects. the -dynamiclib switch still works for creating dylibs. This post is left for historical curiosity.]
—
Some free software packages have an optional make target to build shared libraries out of their core application functions. Unfortunately, some of these packages are set up to compile for typical Linux shared objects. For example:
gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1 $(OBJ)
where $(OBJ) is your set of object files.
On Apple’s GCC (for Tiger and Leopard, at least), there is no -shared switch, and no -soname switch either. Compilation will fail at this step. The incantation to build a shared object would translate to something like:
gcc -dynamiclib -Wl,-headerpad_max_install_names,-undefined,dynamic_lookup,-compatibility_version,1.0,-current_version,1.0,-install_name,/usr/local/lib/libfoo.1.dylib -o libfoo.1.dylib $(OBJ)
headerpad_max_install_names will allow you to change the install path with install_name_tool later, should the install_name change during the life of the compiled object.
You must also ensure that your object files are compiled correctly for shared library usage. Usually this means compiling with -fPIC and -fno-common, depending on your code.
I’ve had to do this infrequently, which means I forget the syntax the next time and have to google for it again. Too many “cache-misses”, so to speak.
Thanks! One point, there should be no spaces in the arguments passed to -Wl
Yep, you’re absolutely right. Looks like I accidentally typed extraneous spaces after some commas. Thanks for pointing that out. Should be fixed now.