开发者

Mixed static and dynamic link on Mac OS

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 f开发者_StackOverflow社区or 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?


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++.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜