2017-05-26 193 views
1

我想從go應用程序中使用動態C庫,我可以構建應用程序,但在運行時找不到該庫。 這裏我的項目的結構:如何使用相對路徑中的動態鏈接庫

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

我導入h和.so文件:

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

func main() { 
    C.testMyLib() 
} 

我可以成功地構建應用程序,但啓動時,它拋出這個錯誤:

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

如果我將libmylib.so文件複製到/ usr/lib中,那麼一切都按預期工作;不過,我希望我的應用程序可以在運行時自動在CURRENT_PATH/lib中搜索所需的庫,而無需設置環境變量。我怎樣才能實現它?

+0

見'$ {SRCDIR}'的[CGO文件]中(https://golang.org/cmd/cgo/) – JimB

+0

@JimB我嘗試過了,這是行不通的。運行時引發的錯誤完全相同。 –

回答

0

我能夠解決加入-Wl,-rpath=\$ORIGIN/lib鏈接器標誌LDFLAGS在main.go文件選項問題:在執行應用程序時

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

的current_path添加/ lib目錄加入/etc/ld.so.conf或/etc/ld.so.conf.d/mylib.conf和運行sudo ldconfig

而且使用的完整路徑,-I和-L在CFLAGS & LDFLAGS中。

+0

其實我的目標是完全避免完整路徑並避免使用環境變量。我需要一個便攜式解決方案,這是我從我的系統複製到另一個的一種工具,它可以直接使用。 –