2016-10-26 3 views
0

私は共有ライブラリを呼び出すCソースをコンパイルしており、.soファイル(異なるcpuアーキテクチャ)ではなく、ビルドマシン上にライブラリヘッダのみを持っています。実行時にコードを検索して/usr/lib/libx.soをロードさせるにはどうすればよいですか?.soファイルのない共有ライブラリ用にビルド

+0

libディレクトリをLD_LIBRARY_PATHに追加します。 –

+0

'dlopen'を使うと'/lib'と '/ usr/lib'を自動的に(その順に)検索します。 – deamentiaemundi

+0

dlsymも呼び出すか、元のシンボル名を使用して-Wlでビルドしますか? - 未解決シンボル=オブジェクトファイルを無視しますか? – Liam

答えて

1

元のLD_LIBRARY_PATHの提案から改訂されました。

Linuxシステム上にあると仮定すると、共有ライブラリはLD_PRELOAD環境変数を経由して実行を開始する前にロードすることがあります。

$ LD_PRELOAD="/usr/lib/libx.so" your_app 

しかし、-Wl,--unresolved-symbols=ignore-in-object-filesとリンクすることはおそらく良い習慣ではありません。私はdlsymを使用して、動的ライブラリから任意のシンボルを読み込むことをお勧めします。たとえば、このコンパイルする

#include <stdlib.h> 
#include <stdio.h> 
#include <dlfcn.h> 

int main() 
{ 
    void *handle; 
    void (*foo_fp) (void); // function signature from dynamic library 

    // Dynamically load libfoo.so, searching it from LD_LIBRARY_PATH 
    handle = dlopen ("libfoo.so", RTLD_LAZY); 

    // Load function 'foo' from libfoo.so 
    foo_fp = dlsym(handle, "foo"); 

    // Calls 'foo' from libfoo.so 
    foo_fp(); 
    return 0; 
} 

:実行するには

gcc -o main main.c -ldl 

を:

export LD_LIBRARY_PATH=<location of libfoo.so> 
./main 
+0

動作しません。おそらく、-l *なしで構築されたからです。 – Liam

+0

実行ファイルの構築方法を明確にすることはできますか?このリファレンスは、あなたにも役立つかもしれません:http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html –

+0

gcc -o app src.c -Wl、 - unresolved-symbols = ignore-in-オブジェクトファイル – Liam

1

は必要なシンボルをエクスポートし、ファイルlibx.so 'ダミー' を作成します。

関連する問題