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 fi
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.
I ran into the same problem. As it turned out, there seems to be no way to link libraries statically without specifying the full path to the .a-file.
However, there seems to be neat trick in Makefile
's allowing for smooth usage.
vpath %.a /opt/local/lib
.LIBPATTERNS lib%.a lib%.dylib lib%.so
STATICLIBS = -lssh2
libmy.dylib: my1.o my2.o $(STATICLIBS)
g++ -dynamiclib -o libmy.dylib $^
Note how the $(STATICLIBS)
variable is put in the dependencies. Make will not treat dependecies with an '-l' prefix as files - but rather as libraries. Using the above vpath
magic make looks up the libraries and put the full path on the commandline to g++.