web-dev-qa-db-ja.com

.soファイルでcプログラムを実行する方法

StackOverflowとAskUbuntuのすべてのソリューションを試しました。

Goプログラムがあります:

package main

import "C"

//export Getint
func Getint() int {
        return  2
}

func main() {}

.sot.h`という名前のt.so and header fileファイルを生成しました

ここで、この関数をCプログラムで使用したいと思います。
コードを記述しましたが、実行方法がわかりません。

#include <stdio.h>
#include <t.h>
int main()
{
int a;
a=Getint();
printf("number : %d",a);
return 0;
}

で実行すると

gcc c.c t.so

a.outファイルを生成します

ただし、a.out./a.outと一緒に実行すると、エラーが発生します。

./a.out
Error while loading shared libraries: t.so: can not open shared object file: no such file or directory exists.

それから私は試してみました:

gcc -c c.c -l t.so

したがって、c.oファイルを生成し、実行可能ではありません。

6
NIket

ほとんどの場合、ローダーはライブラリを見つけることができません。バイナリを実行する前に、ライブラリが配置されているディレクトリへのパスをLD_LIBRARY_PATHに設定してみてください。

export LD_LIBRARY_PATH=/path/to/my/library
./a.out
3
dmi

リンカーオプション_-rpath_ を使用する必要があります。これは、実行可能プログラムに_.so_ファイルなどのランタイムライブラリの場所に関する情報を追加するようにリンカーに指示します。 。

これは、GCCフロントエンドプログラムにオプションをリンカーに渡すように指示するGCCオプション_-Wl_を使用して実行できます。

_$ gcc c.c t.so -Wl,-rpath=$(pwd)
_

これにより、-rpath=$(pwd)がリンカーに渡され、$(pwd)により、シェルはpwdコマンドを呼び出して現在のディレクトリを返します。

ライブラリを移動しない限り、プログラムは機能するはずです。


can環境変数_LD_LIBRARY_PATH_も使用しますが、 非推奨 です。

.soファイルは共有オブジェクトです。つまり、ファイルを必要とするすべてのアプリケーションで使用できるオブジェクトです。つまり、共有されます。この特性のため、それらはよく知られた場所に保管する必要があります。また、動的リンカーによってインデックスを作成する必要があります。

たとえばLinuxでは、通常、ファイルがあります/ etc/ld.so.conf共有オブジェクトが自動的に読み取られるすべてのディレクトリが保存されます

したがって、オプションは次のとおりです。

  • 共有オブジェクトファイルをよく知られた場所に置きます
  • 共有オブジェクトファイルを任意の場所に配置し、ダイナミックリンカに通知します。Linuxでは、ld.so.confを変更し、ldconfigを実行してldを更新できます。インデックス
  • 他の提案として、.soのパスを環境変数LD_LIBRARY_PATHに書き込みます(ダイナミックリンカがアプリケーションを実行する前にパスを読み取るため)。これは、各環境の作成時に実行する必要があります
  • 他の提案されているように、コンパイル時に-rpathを使用します。この方法では、コンパイル後に.soファイルを移動できないことに注意してください

個人的には、システムライブラリパスに.soファイルをインストールすることを好みます

2
Jack

LD_LIBRARY_PATHを使用して、ダイナミックリンカがリスト内の共有ライブラリを見つけられるようにする必要があります。構文は、PATH:で区切られたディレクトリのリストに似ています。

OSXでは、この環境変数はDYLD_LIBRARY_PATHと呼ばれます。