Issue
I want to use gcc to produce a shared library, but i want to link some other libraries it depends on statically. Now to produce the "standard" dynamically linked output file i use
gcc -dynamiclib *.o -lfoo -lbar -o outfile
which would be
gcc -shared *.o -lfoo -lbar -o outfile
on for a binutils ld
on a linux system. Now if i want libfoo and libbar to be linked statically, I can name the static libraries directly
gcc -dynamiclib *.o /usr/lib/libfoo.a /usr/lib/libbar.a -o outfile
however, that way i have to look for the library files myself. GNU binutils ld
supports this:
gcc -shared *.o -l:libfoo.a -l:libbar.a -o outfile
but apple's ld
doesnt.
- Is there a way to make apple's
ld
look for the static libraries himself? - If not, is there another way that would avoid naming the exact location of the archives, e.g. producing an intermediate output file out of the object files requiring libfoo and libbar with the
-static
switch and linking that file together with the remaining objectfiles to create the dynamic object?
Solution
Quoting QA1393,
Normally, the linker goes through each path in the search paths one at a time to find a dynamic version of the library. If none is found, it goes through each of those paths looking for a static version of the same library. There is no way to choose a static library over a corresponding dylib if both libraries are in the same directory without using the -l linker option and absolute paths to each library.
As recommended by QA1393, you can place your static libraries in a different directory, use -L/path/to/static/libraries
before other occurrences of -L
that could point to dynamic libraries, and -search_paths_first
so that the linker tries both .dylib (which won’t be there) and .a in the first search path before searching the next search path and so forth.
Answered By - user557219