115

同じ名前の関数を提供するライブラリが 2 つある場合はどうすればよいですか?

4

13 に答える 13

18

Windows では、LoadLibrary()を使用してこれらのライブラリの 1 つをメモリにロードし、次にGetProcAddress()を使用して、呼び出す必要のある各関数のアドレスを取得し、関数ポインターを介して関数を呼び出すことができます。

例えば

HMODULE lib = LoadLibrary("foo.dll");
void *p = GetProcAddress(lib, "bar");
// cast p to the approriate function pointer type (fp) and call it
(*fp)(arg1, arg2...);
FreeLibrary(lib);

foo.dll 内の bar という名前の関数のアドレスを取得して呼び出します。

Unix システムが同様の機能をサポートしていることは知っていますが、それらの名前が思いつきません。

于 2009-03-24T17:38:04.237 に答える
11

そこに.oファイルがある場合、ここに良い答えがあります: https://stackoverflow.com/a/6940389/4705766

概要:

  1. objcopy --prefix-symbols=pre_string test.o.o ファイル内のシンボルの名前を変更するには

また

  1. objcopy --redefine-sym old_str=new_str test.o.o ファイル内の特定のシンボルの名前を変更します。
于 2016-12-29T08:19:36.303 に答える
7

一緒に使用しないでください。私の記憶が正しければ、このような場合、リンカはエラーを出します。

私は試しませんでしたが、動的ライブラリをプログラムで処理できるようにするdlopen()解決策があるかもしれません。2 つの関数を同時に必要としない場合は、最初のライブラリを開いて最初の関数を使用し、2 番目のライブラリ/関数を使用する前に最初のライブラリを閉じることができます。dlsym()dlclose()

于 2009-03-24T17:01:38.460 に答える