44

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

// 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

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

4

4 に答える 4

59

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

コマンドラインでその後に続くライブラリでは、参照されていないシンボルは破棄されません。--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
于 2013-01-02T03:20:58.113 に答える
8

元々の提案は「近い」でした:

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

于 2013-01-02T03:21:42.083 に答える
6

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

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

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

    g++ -o program main.o mylib/*.o
    
于 2013-01-02T05:38:36.253 に答える
4

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

于 2017-05-10T13:44:10.753 に答える