how to force linker to use shared library instead of static library?
You could use -l
option in its form -l:filename
if your linker supports it (older versions of ld
didn't)
gcc -o app app.o -L. -l:libtest.so
Other option is to use the filename directly without -l
and -L
gcc -o app app.o /path/to/library/libtest.so
How can I force ld to link against static library
Inside the
Netica_API_607/lib
directory, I have bothlibnetica.a
andlibnetica.so
This should work:
gcc -shared ... -L/home1/.../Netica_API_607/lib -Wl,-Bstatic -lnetica -Wl,-Bdynamic ...
Alternatively, you should be able to do this:
gcc -shared ... /home1/.../Netica_API_607/lib/libnetica.a ...
I thought that the
-dn
and-dy
switches would
These switches are "global"; that is: -dn
sets a boolean inside the linker to "never use shared libraries", and the -dy
flips that boolean back to default, regardless of where on the command line these switches occur.
Static link of shared library function in gcc
Refer to:
http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/
You need the static version of the library to link it.
A shared library is actually an executable in a special format
with entry points specified (and some sticky addressing issues
included). It does not have all the information needed to
link statically.
You can't statically link a shared library (or dynamically link a static one).
The flag -static
will force the linker to use static libraries (.a) instead of shared (.so) ones. But static libraries aren't always installed by default, so you may have to install the static library yourself.
Another possible approach is to use statifier or Ermine. Both tools take as input a dynamically linked executable and as output create a self-contained executable with all shared libraries embedded.
How to force ld to use a static lib instead of shared lib?
If you want to force the linker to use the static version of a particular library you can use the :filename
to force a particular library instead of just giving the linker a 'base' library name and letting it use the first one it finds:
g++ main.cpp -o a.out -l:./libtest.a
From http://sourceware.org/binutils/docs-2.23.1/ld/Options.html:
-l namespec
--library=namespec
Add the archive or object file specified by
namespec
to the list of
files to link. This option may be used any number of times. If
namespec
is of the form:filename
, ld will search the library path for
a file calledfilename
, otherwise it will search the library path for
a file calledlibnamespec.a
.On systems which support shared libraries, ld may also search for
files other thanlibnamespec.a
. Specifically, on ELF and SunOS
systems, ld will search a directory for a library called
libnamespec.so
before searching for one calledlibnamespec.a
. (By
convention, a .so extension indicates a shared library.) Note that
this behavior does not apply to:filename
, which always specifies a
file calledfilename
.
Link a static library to a shared one during build?
You need --whole-archive
linker option in this case to command the linker to include whole static libs' content into the shared lib.
g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive
From man ld
:
For each archive mentioned on the command line after the --whole-archive option, include every object file in the archive in the link, rather than searching the archive for the required object files. This is normally used to turn an archive file into a shared library, forcing every object to be included in the resulting shared library. This option may be used more than once.
Two notes when using this option from gcc: First, gcc doesn't know about this option, so you have to use -Wl,-whole-archive. Second, don't forget to use -Wl,-no-whole-archive after your list of archives, because gcc will add its own list of archives to your link and you may not want this flag to affect those as well.
g++ linker: force static linking if static library exists?
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed
Will link zlib
and libfoo
as static, and libbar
as dynamic . --as-needed
will drop any unused dynamic library.
Related Topics
Force to Link Against Unused Shared Library
Libstdc++ Static Linking in Dynamic Library
While (1) VS. for (;;) Is There a Speed Difference
Windows 7 Timing Functions - How to Use Getsystemtimeadjustment Correctly
Inspecting Standard Container (Std::Map) Contents with Gdb
Difference Between *(Pointer + Index) and Pointer[]
What Is the Default Constructor for C++ Pointer
C++ Auto Keyword. Why Is It Magic
Long Long Int VS. Long Int VS. Int64_T in C++
How to Monitor a Folder with All Subfolders and Files Inside
Problems Cross Compiling Qt 4.7 from Source for Arm
Lifetime of a Std::Initializer_List Return Value
Singleton Instance Declared as Static Variable of Getinstance Method, Is It Thread-Safe