2016-10-01 13 views
0

私が依存関係を挿入すると、それは共有ライブラリに定義されているクラスBのクラスAのインスタンスにします。共有ライブラリにはクラスAのオブジェクトファイルが必要ですか? (Meantはライブラリのコンパイル後のg ++​​リンケージ段階で、実行時のOSリンケージではありません)共有ライブラリの依存性注入は、libにオブジェクトファイルが必要ですか?

実際に私はこれをLinuxで試しましたが、実際には試していません。これはすべてのプラットフォームで当てはまりますか?

#ifndef SOME_HEADERB_H 
#define SOME_HEADERB_H 
class A; 
struct B { 
    void whoopUsingA(A* a); 
}; 
#endif 

b.cpp

#include "b.h" 
#include "a.h" 
#include <iostream> 
void B::whoopUsingA (A* a){ 
    std::cout << "B whoops A."<< std::endl; 
    a->whoop(); 
} 
b.h

a.h

#ifndef SOME_HEADERA_H 
#define SOME_HEADERA_H 
struct A{ 
    void whoop(); 
}; 
#endif 

a.cpp

#include <iostream> 
#include "a.h" 
void A::whoop(){ 
    std::cout << "A whooped."<< std::endl; 
} 

を(必須でない限り、この場合、シンボルの可視性を無視)

main.cppに

#include "a.h" 
#include "b.h" 
int main (int argc, const char* argv[]) { 
    A a; 
    B b; 
    b.whoopUsingA(&a); 
    return 0; 
} 

答えて

0

答えはどちらも "はい" や "いいえ" です。

あなたはここ3つのオブジェクト・ファイルがあります。
B(b.cppから、共有ライブラリになります)
A(a.cppから、実行可能プログラムの一部)
メイン(main.cppにからの、

.hファイル(少なくとも正常に使用されている場合)は、オブジェクトファイルにはならないことを理解することが重要です。タプル全体(1つのcppとすべてのヘッダ)が1つのオブジェクトファイルになる前に、Cppsにヘッダが含まれています。

だから、今やb.hにはclass A;があり、このクラスのオブジェクトを使いたいと思っています。あなたが見てきたように、これでは十分ではありません。これが動作するために必要なのは、ファイルa.hです。しかし、ではなく、にはa.cppやオブジェクトファイルが必要ですが、ヘッダだけで十分です。また

重要:
場合などABIの問題で、これが動作しない場合がありますので:A)あなたはすべてのオブジェクトファイル
bについて同じコンパイラを使用していない
)あなたは同じコンパイラの異なるバージョンを使用します(いくつかの組み合わせは動作しますが、他のものは動作しません)
c)特定のコンパイラフラグはすべてのオブジェクトファイルで同じではありません
d)...