0

ライブラリ A に依存するバイナリがライブラリ B に依存するシナリオがあります。

ライブラリ B に対してライブラリ A をビルドしましたが、ライブラリ B:s のシンボルがライブラリ A から漏れることはなく、すべてが cpp ファイルに含まれています。

バイナリで見つかったすべてのシンボルはライブラリ A で満たすことができるため、バイナリをライブラリ A に対してのみリンクしたいと考えています。これは可能ですか?

実際のアプリケーションでは、ライブラリ B はネットワーク プロトコルの実装であり、中間ライブラリにリンクする多数のバイナリがあります。また、使用されているさまざまなネットワーク プロトコルをバイナリに認識させたくありません。

プラットフォーム: Linux / GCC

コード:

liba/liba.h:

#ifndef LIBA_H
#define LIBA_H

int getANumber();

#endif

liba/liba.cpp:

#include "liba.h"
#include "../libb/libb.h"

int getANumber(){ return getBNumber(); }

libb/libb.h:

#ifndef LIBB_H
#define LIBB_H

int getBNumber();

#endif

libb/libb.cpp:

#include "libb.h"

int getBNumber(){ return 42; }

main.cpp:

#include "liba/liba.h"
#include <iostream>

int main(int argc, char** argv) {
  std::cout << getANumber() << std::endl;
  return 0;
}

コマンド:

~/libb/ $ g++ -shared -o libb.so libb.cpp
~/liba/ $ g++ -shared -o liba.so liba.cpp -L../libb -lb

~/ $ g++ -o main main.cpp -Lliba -la # fails

~/ # These two work, but I don't want to specify libb here.
~/ $ g++ -o main main.cpp -Lliba -la -Wl,-rpath-link,libb 
~/ $ LD_LIBRARY_PATH=libb g++ -o main main.cpp -Lliba -la

これを解決する最善の方法は何ですか? プラグインとして作成する必要がありますか?

よろしく、 ダニエル

4

1 に答える 1

0

実行時に使用するライブラリを変更したい場合は、直接リンクすることはできませんが、「手動」ロードを使用してください。つまり、呼び出しdlopenて、dlsym

これはおそらく、「libb」の各関数が関数ポインターになるため、「liba」でわずかに異なるアーキテクチャが必要であることも意味します。したがって、次の行に沿った何か:

int (*getBNumber)() = NULL;

void initialize()
{
   void *handle = dlopen("libb", RTLD_NOW); 
   getBNumber = (int (*)())dlsym(handle, "getBNumber"); 
}

int getANumber(){ return getBNumber(); }

ある時点で初期化を呼び出すように何かを設定する必要があります-またはif (!initialized) initialize();各関数に a があります。

于 2013-08-06T12:00:28.423 に答える