Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
394 views
in Technique[技术] by (71.8m points)

c - 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 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?
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...