私はプログラムと静的ライブラリを持っています:
// 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
もっと良いアイデアはありますか?
--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
私は他の答えが好きですが、ここに別の「解決策」があります。
Arコマンドを使用して、アーカイブからすべての.oファイルを抽出します。
cd mylib ; ar x /path/to/libmylib.a
次に、これらすべての.oファイルをリンカーコマンドに追加します。
g++ -o program main.o mylib/*.o
静的ライブラリに未使用として削除された特定の関数があるが、本当に必要な場合(1つの一般的な例はJNI_OnLoad()関数)、リンカーに強制的に保持させることができます。 (そして当然、この関数から呼び出されるすべてのコード)。追加 -u JNI_OnLoad
をリンクコマンドに追加します。