How can I link a shared library function statically in gcc?
6 Answers
Refer to:
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.

- 43,637
- 15
- 53
- 61
-
29What information does the static library have, so that it can be statically linked, that the dynamic library doesn't have? – kbolino Oct 17 '18 at 16:52
-
If you want to link, say, libapplejuice statically, but not, say, liborangejuice, you can link like this:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
There's a caveat -- if liborangejuice
uses libapplejuice
, then libapplejuice
will be dynamically linked too.
You'll have to link liborangejuice
statically alongside with libapplejuice
to get libapplejuice
static.
And don't forget to keep -Wl,-Bdynamic
else you'll end up linking everything static, including libc
(which isn't a good thing to do).

- 5,335
- 7
- 47
- 63

- 1,591
- 2
- 14
- 14
-
2Isn't there a way to tell gcc directly what to link statically, and not to bypass him and talk with the linker? – Elazar Leibovich May 15 '11 at 12:39
-
1@ElazarLeibovich you can't get a combination of static and dynamic that way. – Haozhun May 20 '13 at 07:20
-
@EugeneBujak: The _caveat_ does not apply on my system. Example: `gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.` _libB_ uses _libA_, it linked and `ldd` does not show a reference to _libA_. The executable works fine. Tested with g++ 4.7.3. – radix Nov 24 '16 at 15:01
-
An indirect (nested), static, dependency of a direct, dynamic, dependency does not itself become dynamically linked. – Vinny Nov 19 '19 at 01:06
-
Consider the following: binA depends on libB.so which depends on libC.a As others have already stated, .so's are themselves executables, so when a shared object is linked, any static library dependents are processed by the linker much the same as if an executable was being linked: the only symbols pulled in from the .a static lib are those referenced (and unresolved) by the .so. This means that if binA references a symbol in libC.a, not referenced anywhere in libB.so, then even if binA links to libB.so, that symbol will be undefined (unless -Wl,--whole-archive is used when linking libB.so). – Vinny Nov 19 '19 at 01:17
Yeah, I know this is an 8 year-old question, but I was told that it was possible to statically link against a shared-object library and this was literally the top hit when I searched for more information about it.
To actually demonstrate that statically linking a shared-object library is not possible with ld
(gcc
's linker) -- as opposed to just a bunch of people insisting that it's not possible -- use the following gcc
command:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Of course you'll have to compile objectname.o
from sourcename.c
, and you should probably make up your own shared-object library as well. If you do, use -Wl,--library-path,.
so that ld can find your library in the local directory.)
The actual error you receive is:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Hope that helps.

- 851
- 8
- 15
If you have the .a file of your shared library (.so) you can simply include it with its full path as if it was an object file, like this:
This generates main.o by just compiling:
gcc -c main.c
This links that object file with the corresponding static library and creates the executable (named "main"):
gcc main.o mylibrary.a -o main
Or in a single command:
gcc main.c mylibrary.a -o main
It could also be an absolute or relative path:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
A bit late but ... I found a link that I saved a couple of years ago and I thought it might be useful for you guys:
CDE: Automatically create portable Linux applications
http://www.pgbovine.net/cde.html
- Just download the program
Execute the binary passing as a argument the name of the binary you want make portable, for example: nmap
./cde_2011-08-15_64bit nmap
The program will read all of libs linked to nmap and its dependencias and it will save all of them in a folder called cde-package/ (in the same directory that you are).
- Finally, you can compress the folder and deploy the portable binary in whatever system.
Remember, to launch the portable program you have to exec the binary located in cde-package/nmap.cde
Best regards

- 415
- 4
- 5
-
2While not exactly providing the answer to the question - its a notable solution to the problem. – razong Mar 12 '15 at 08:51
-
2
In gcc, this isn't supported. In fact, this isn't supported in any existing compiler/linker i'm aware of.

- 15,882
- 9
- 57
- 104
-
4Could you explain how static linking is not supported by any existing compiler? – jww Oct 13 '12 at 23:50
-
5