Martin
Martin

Reputation: 9359

How to force gcc to link an unused static library

I have a program and a static library:

// main.cpp
int main() {}

// mylib.cpp
#include <iostream>
struct S {
    S() { std::cout << "Hello World\n";}
};
S s;

I want to link the static library (libmylib.a) to the program object (main.o), although the latter does not use any symbol of the former directly.

The following commands do not seem to the job with g++ 4.7. They will run without any errors or warnings, but apparently libmylib.a will not be linked:

g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a

or

g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib

Do you have any better ideas?

Upvotes: 46

Views: 28470

Answers (4)

brian beuning
brian beuning

Reputation: 2862

I like the other answers better, but here is another "solution".

  1. Use the ar command to extract all the .o files from the archive.

    cd mylib ; ar x /path/to/libmylib.a
    
  2. Then add all those .o files to the linker command

    g++ -o program main.o mylib/*.o
    

Upvotes: 6

Alex Cohn
Alex Cohn

Reputation: 57173

If there is a specific function in the static library that is stripped by the linker as unused, but you really need it (one common example is JNI_OnLoad() function), you can force the linker to keep it (and naturally, all code that is called from this function). Add -u JNI_OnLoad to your link command.

Upvotes: 5

paulsm4
paulsm4

Reputation: 121629

The original suggestion was "close":

Try this: -Wl,--whole-archive -lyourlib

Upvotes: 8

Alex B
Alex B

Reputation: 84802

Use --whole-archive linker option.

Libraries that come after it in the command line will not have unreferenced symbols discarded. You can resume normal linking behaviour by adding --no-whole-archive after these libraries.

In your example, the command will be:

g++ -o program main.o -Wl,--whole-archive /path/to/libmylib.a

In general, it will be:

g++ -o program main.o \
    -Wl,--whole-archive -lmylib \
    -Wl,--no-whole-archive -llib1 -llib2

Upvotes: 63

Related Questions