2016-09-23 13 views
0

私は楽しいために詩のライブラリを書いていますが、私は自分の仕事を工夫するのが難しいです。私は1つの静的ライブラリを持っており、 "静的プラグイン"システム(名前を許してください)を作りたいと思います。「プラグイン」スタティックライブラリの提案

だから、私は次の規則を尊重し静的ライブラリのシリーズを作成したいと思います:

  • 各ライブラリは、1つのオブジェクト(クラス、または何が必要とされている)
  • が含まれています
  • クラスは、各配列の項目が配列である
  • 1つの配列が含まれている必要がありunsigned char

本質的には、この作業では、詩のリストを提供する一連のライブラリを作成したいと考えています。したがって、各図書館には1人の著者の詩が含まれています。

ここで私が必要とする部分は次のとおりです。ライブラリユーザは、必要な静的プラグインとメインライブラリをリンクするだけです。これにより、ユーザは、この単純な例のように、コンソールで詩のリポジトリ全体を印刷することができる:

#include "poems.hpp" 

int main(int argc, const char * argv[]) 
{ 
    poems p; 

    p.dump(">>> Dumping poems"); 

    return 0; 
} 

すべてのプロセスがリンク時に処理される

$ clang++ a.cpp libpoems.a libplugin_coleridge.a 
$ ./a.out 
>>> Dumping poems 
The Rime of the Ancient Mariner 
    It is an ancient Mariner, 
    And he stoppeth one of three. 
[...] 
Kubla Khan 
    In Xanadu did Kubla Khan 
    A stately pleasure-dome decree: 
[...] 

または代替的に

$ clang++ a.cpp libpoems.a libplugin_shelley.a 
$ ./a.out 
>>> Dumping poems 
Ozymandias 
    O wild West Wind, thou breath of Autumn's being, 
    Thou, from whose unseen presence the leaves dead 
[...] 
Ode To The West Wind 
    O wild West Wind, thou breath of Autumn's being, 
    Thou, from whose unseen presence the leaves dead 
[...] 

poem.hppに、外部オブジェクトやそれに類するものの呼び出しを含むクラスなどを作成することができます。

ヒントは歓迎します。

+0

だから、ダンプを行うライブラリに、ライブラリごとに同じ名前を付け、リンカによって解決される関数を置くことになります。それでは、ここでの質問は何ですか? –

+0

関数だけでなく、ダンプに必要なすべてのデータ、またはそれが価値あるものであれば、他の関数(例えば、詩の検索)も可能です。 – senseiwa

答えて

0

私はあなたがC/C++でこれを各オブジェクトファイル内の単一の文字列だけで行うことはできないと思います。まず、印刷機能はある種の詩のリストを処理できる必要があります。

私はこの種のことは、通常、コンパイラーの静的オブジェクト初期化子(登録オブジェクト経由で)を使って行われると思います。

最終的には、あなたの文字列へのリンクのリストであるメインが呼び出せるシンボルが必要になります。

したがって、「文字列のリストにクラスを追加する」クラスを作成できます。次に、各モジュールで、これらの加算器の1つの静的インスタンスを実行します。

プログラムがロードされると、C++ランタイムライブラリは静的オブジェクトのすべてのコンストラクタを呼び出します。そのため、コンストラクタは文字列をよく知られたリストに追加する必要があります。

静的オブジェクトが構築される順序は定義されていないので、リストが単純な基本型(リンクされたリストの先頭へのポインタ)か、リストの遅延構築を行うこと(つまり、最初のコンストラクタはリストオブジェクトを作成し、それを基本ポインタ型に割り当てます)。例えば

メイン。CC

#include <stdio.h> 
#include "poem.h" 

Poem* s_poemList = NULL; 

int main() { 
    Poem* poem = s_poemList; 

    while (poem) { 
    printf("%s\n", poem->text); 
    poem = poem->next; 
    } 
} 

poem.h

#ifndef __POEM_H__ 
#define __POEM_H__ 

class Poem; 

extern Poem* s_poemList; 

class Poem { 
public: 
    Poem(const char* text) 
    : text(text) { 
    next = s_poemList; 
    s_poemList = this; 
    } 

    class Poem* next; 
    const char* text; 
}; 


#endif 

poem1.cc

#include "poem.h" 
static Poem poem("This is the text from Poem1\n"); 

poem2.cc

#include "poem.h" 
static Poem poem("This is the text from Poem2\n"); 

は、これは、あなたがしなければ成功するシステムを作成します。

cc main.cc poem1.cc poem2.cc 

各オブジェクトは実行可能ファイルにリンクされ、リンカはコンストラクタが呼び出されることを確認します。あなたがアーカイブに詩を作る場合

しかし、:その後、

cc -c poem1.cc 
cc -c poem2.cc 
ar cr libpoems.a poem1.o poem2.o 

とそのライブラリをリンク:

cc main.cc -lpoems 

リンカは必要としないので、それは詩を印刷に失敗しますライブラリのオブジェクトファイルはリンクされないので、コンストラクタは実行されないので、リストは空のままです。ライブラリからオブジェクトをインクルードするようにリンカーに強制する必要があります。私のMac上で私はどうなる:

cc main.cc -Xlinker -force_load ./libpoems.a 
-Xlinkerがリンカに次のオプションを渡し、それが必要とされていない場合でも-force_loadは./libpoems.aファイル内のすべてのオブジェクトを含めるようにリンカに指示します

main.ccによって