2011-12-06 30 views
3

静的ライブラリの一部を、Linuxでg ++を使ってC++で書かれたプログラムにリンクしようとしています。C++静的ライブラリの必要な部分のみをリンクする

my_lib.h

#ifdef USE_EXTERN_LIB 
# include <extern_lib.h> 
void do_something (struct extern_lib); 
#endif 

void do_other (int); 

my_lib.c

#include "my_lib.h" 

#ifdef USE_EXTERN_LIB 
void do_something (struct extern_lib l) 
{ 
    // do something 
} 
#endif 

void do_other (int a) 
{ 
    // do something 
} 

私は静的にそれにすべてを含めるように-DUSE_EXTERN_LIBプリプロセッサフ​​ラグでlibmy_lib.aを作成しています。

が、私は何をしたい二つのプログラムを作成することです:* extern_libでこのライブラリを使用しています1 *と* extern_libの*なしでそれを使用する1、すなわち:

g++ -L/path/to/lib -lmy_lib -o prog_wihtout_lib prog_without_lib.cc 
g++ -DUSE_EXTERN_LIB -L/path/to/lib -lmy_lib -o prog_with_lib prog_with_lib.cc 

、第2のプログラムのコンパイルではなく、最初に、extern_libが宣言されていないと言います。

動的ライブラリでは、実行時にシンボルがロードされるので問題はありませんが、静的ライブラリが必要です。 静的ライブラリのモジュールのみをリンクする方法はありますか?

EDIT

prog_without_lib.cc

#include "my_lib.h" 

int main() 
{ 
    do_other (42); 

    return 0; 
} 

prog_with_lib.cc

#include "my_lib.h" 

int main() 
{ 
    do_other (42); 

    struct extern_lib l; 
    do_something (l); 

    return 0; 
} 

感謝。

+3

「第2の」コンパイルの正確なエラーを教えてください。 'USE_EXTERN_LIB'が定義された2番目の手段を仮定します。 – David

+0

my_lib.cの '#include" my_lib.h "は? – hmjd

+0

申し訳ありませんが、それはあなたがprog_without_lib.ccソースを投稿することができ – marmottus

答えて

0

あなたは2番目のコマンドラインでビルドする際に、コマンドラインに外部ライブラリを追加する必要があります。

g++ -DUSE_EXTERN_LIB -I/path/to/external_lib/headers -o prog_wih_lib prog_with_lib.cc -L/path/to/external_lib/libfile -lexternal_lib -lmy_lib 

はまた、私は、コマンドラインの末尾にライブラリを置くことに注意してください。それはもはや必要ではないかもしれませんが、それはリンカがコマンドラインで与えられた順序で入力ファイルをスキャンしていたため、オブジェクトファイルを使用する前にライブラリがコマンドライン上にあった場合、リンカはシンボルが見つかりませんでしたというエラーが表示されます。

5

ライブラリでリンクして、リンカが未使用のコードを削除することを心配してください。それはその仕事です。

あなたがやろうとしていることは意味をなさない(いいえ、ダイナミックライブラリでも意味をなさないでしょう)。ライブラリをコンパイルして最初の行でそれを行うときだけ効果があることを定義します。 2行目では、すでにコンパイルされたライブラリを実行可能ファイルにリンクするだけです。しかし、実際には、静的ライブラリの全ポイントはリンカに見えるため、(他のものの中でも)使用されていないコードを取り除くことができます。では、どうしてUSE_EXTERN_LIBを定義する必要がありますか?

関連する問題