Suppose I have a third party library called somelib.a on a Mac running Mountain Lion with Xcode 4.4 installed. I want to get a dynamic library out of it called somelib.dylib. An appropriate Linux command would be:
g++ -fpic -shared -Wl,-whole-archive somelib.a -Wl,-no-whole-archive -o somelib.so
where -whole-archive and -no-whole-archive are passed to the linker. When I do the equivalent for Mac:
g++ -fpic -shared -Wl,-whole-archive somelib.a -Wl,-no-whole-archive -o somelib.dylib
ld fails with an error:
ld: unknown option: -whole-archive
It seems that the ld on OSX is different from GNU ld. How do I have to modify above command so I will get the desired result?
Thank you in advance!
Note: A link for the documentation of the OSX
ld
linker.http://www.unix.com/man-page/osx/1/ld/
I know it is late to give an answer for this, but I do not have enough reputation to make a comment on @hanslovsky answer. However, it helps me a lot to have the docs of the options too. It helps what the options do exactly, and that other options the
ld
linker also has. So I just wanted to share with others who finds linking an issue.UPDATE:
After the comment from @GhostCat I have decided to expand my answer.
The docs for
-all_load
is:So it loads for all static libraries that you note. If you want something similar to
--whole-archive
and--no-whole-archive
, then you need to use-force_load
and-noall_load
.-force_load "path_to_archive"
-noall_load
Then you can define which libraries to fully load with
-force_load
and then later turn it off again with-noall_load
.I found out the solution to my problem:
The required arguments are -all_load and -noall_load.
According to the
ld
manual,-noall_load
is the default and is ignored. (If you use it, you get an error message:ld: warning: option -noall_load is obsolete and being ignored
)Apparently the way to get
-all_load
to apply to only one library is as follows: