web-dev-qa-db-ja.com

gccに未使用の静的ライブラリをリンクさせる方法

私はプログラムと静的ライブラリを持っています:

// main.cpp
int main() {}

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

静的ライブラリをリンクしたい(libmylib.a)をプログラムオブジェクト(main.o)、ただし後者は前者のシンボルを直接使用しません。

次のコマンドは、g++ 4.7。エラーや警告なしで実行されますが、明らかにlibmylib.aはリンクされません:

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

または

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

もっと良いアイデアはありますか?

40
Martin

--whole-archiveリンカーオプションを使用します。

コマンドラインにafterが来るライブラリでは、参照されていないシンボルは破棄されません。これらのライブラリの後に--no-whole-archiveを追加すると、通常のリンク動作を再開できます。

あなたの例では、コマンドは次のようになります:

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

一般的には、次のようになります。

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

当初の提案は「近い」ものでした。

これを試して: -Wl,--whole-archive -lyourlib

8
paulsm4

私は他の答えが好きですが、ここに別の「解決策」があります。

  1. Arコマンドを使用して、アーカイブからすべての.oファイルを抽出します。

    cd mylib ; ar x /path/to/libmylib.a
    
  2. 次に、これらすべての.oファイルをリンカーコマンドに追加します。

    g++ -o program main.o mylib/*.o
    
6
brian beuning

静的ライブラリに未使用として削除された特定の関数があるが、本当に必要な場合(1つの一般的な例はJNI_OnLoad()関数)、リンカーに強制的に保持させることができます。 (そして当然、この関数から呼び出されるすべてのコード)。追加 -u JNI_OnLoadをリンクコマンドに追加します。

4
Alex Cohn