StackOverflowとAskUbuntuのすべてのソリューションを試しました。
Goプログラムがあります:
package main
import "C"
//export Getint
func Getint() int {
return 2
}
func main() {}
.so
t.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
ファイルを生成し、実行可能ではありません。
ほとんどの場合、ローダーはライブラリを見つけることができません。バイナリを実行する前に、ライブラリが配置されているディレクトリへのパスをLD_LIBRARY_PATH
に設定してみてください。
export LD_LIBRARY_PATH=/path/to/my/library
./a.out
リンカーオプション_-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共有オブジェクトが自動的に読み取られるすべてのディレクトリが保存されます
したがって、オプションは次のとおりです。
個人的には、システムライブラリパスに.soファイルをインストールすることを好みます
LD_LIBRARY_PATH
を使用して、ダイナミックリンカがリスト内の共有ライブラリを見つけられるようにする必要があります。構文は、PATH
:
で区切られたディレクトリのリストに似ています。
OSXでは、この環境変数はDYLD_LIBRARY_PATH
と呼ばれます。