2017-05-26 9 views
1

goアプリケーションから動的なCライブラリを使用したいが、アプリケーションをビルドすることができるが、実行時にライブラリが見つからない。ここ 私のプロジェクトの構造:私は成功したアプリケーションを構築することができます相対パスから動的にリンクされたライブラリを使用する方法

/* 
#cgo CFLAGS: -I./lib 
#cgo LDFLAGS: -L./lib -lmylib 
#include <mylib.h> 
*/ 
import "C" 

func main() { 
    C.testMyLib() 
} 

が、起動すると、それは、このエラーがスローされます:私は.Hとの.soファイルをインポートmain.goで

src/ctest/ 
     |- lib/ 
     | |- libmylib.so 
     | |- libmylib.h 
     |- main.go 

error while loading shared libraries: libmylib.so.0: cannot open shared object file: No such file or directory 

私は/ usr/libにlibmylib.soファイルをコピーする場合、期待どおり、その後、すべてが動作します。しかし、私のアプリケーションは、環境変数を設定せずに、実行時にCURRENT_PATH/libにある必要なライブラリを自動的に検索したいと思います。どうすれば達成できますか?

+0

'$が{SRCDIR}' [CGOのドキュメント](https://golang.org/cmd/cgo/)に – JimB

+0

@JimBが、私はそれを試してみましたし、それが動作しませんを参照してください。 。実行時にまったく同じエラーがスローされます。 –

答えて

0

私はmain.goファイルにLDFLAGSオプションに-Wl,-rpath=\$ORIGIN/libリンカフラグを追加し、問題を解決することができました:アプリケーションが実行されたとき

package main 
/* 
#cgo CFLAGS: -I${SRCDIR}/lib 
#cgo LDFLAGS: -L${SRCDIR}/lib -Wl,-rpath=\$ORIGIN/lib -luiohook 
#include <uiohook.h> 
*/ 
import "C" 

func main() { 
    C.hook_run() 
} 

は今、それを検索するためにもCURRENT_FOLDER/libが使用しています動的ライブラリ(CURRENT_FOLDERは、アプリケーション実行ファイルが実行されるディレクトリです)。

Linuxユーザーの場合: エラーがスローされた場合は、シンボリックリンクを作成するか、XXX.soライブラリの名前をXXX.so.0に変更する必要があります。私の場合はそれがあった:

src/ctest/ 
    |- lib/ 
    | |- libmylib.so 
    | |- libmylib.so.0 <- symlink to ./libmylib.so 
    | |- libmylib.h 
    |- main.go 
0

/etc/ld.so.confにまたは/etc/ld.so.conf.d/mylib.confと-Iや-Lのための完全なパスを使用する。またsudo ldconfig

を実行するためにCURRENT_PATH/libを追加しますそれぞれCFLAGS & LDFLAGSである。

+0

実際に私の目的は完全なパスを完全に避け、環境変数の使用を避けることです。ポータブルなソリューションが必要です。私のシステムから別のシステムにコピーして、すぐに使えるものです。 –

関連する問題