跳到正文

Golang调用示例

Go语言使用cgo调用C的共享库。cgo是go语言提供的一种与C语言相互调用的方式。

加载SDK

修改libsdk.h文件,修改libsdk.h 文件76-84行中GoString 为"_GoString_"

修改前:

extern char* OnLineUpgrade(GoString lid, GoString sn, GoString key, GoString salt, GoInt pkgSize);
extern char* OffLineUpgrade(GoString dataPath, GoString lid, GoString sn, GoString salt, GoInt pkgSize);
extern char* QueryIOC(GoString query);
extern char* QueryIP(GoString query);
extern char* GetAuth(GoString sn);
extern char* GetAuthActive(GoString sn);
extern char* GetReputationList();
extern char* GetSDKInfo(GoString sn);
extern char* GetDeviceId(GoString sn);

修改后:

extern char* OnLineUpgrade(_GoString_ sn, _GoString_ key, _GoString_ salt, GoInt pkgSize);
extern char* OffLineUpgrade(_GoString_ dataPath, _GoString_ sn, _GoString_ salt, GoInt pkgSize);
extern char* QueryIOC(_GoString_ query);
extern char* QueryIP(_GoString_ query);
extern char* GetAuth(_GoString_ sn);
extern char* GetAuthActive(_GoString_ sn);
extern char* GetReputationList();
extern char* GetSDKInfo(_GoString_ sn);
extern char* GetDeviceId(_GoString_ sn);
  1. 在程序包名下方引入动态库
/*
#cgo CFLAGS: -I.
#cgo LDFLAGS: -L. -lsdk
#include <stdio.h>
#include "libsdk.h"
*/
import "C"

其中:示例中的libsdk.so和libsdk.h与该程序在同一路径下。可根据情况自行指定。

CFLAGS: 编译参数,编译参数主要是头文件的检索路径,预定义的宏等参数

LDFLAGS:链接参数,主要包含要链接库的检索路径和要链接库的名字

  1. 指定动态库路径

如果使用动态加载,运行前需要先将libsdk.so文件拷贝到动态加载库默认的加载路径中,或者将当前路径加到LD_LIBRARY_PATH环境变量中。

指定动态库的路径,需要在当前用户的bash_profile文件[~/.bash_profile]添加下面2行配置。

LD_LIBRARY_PATH=dir:\$LD_LIBRARY_PATH dir为.so和.h文件的路径

export LD_LIBRARY_PATH

最后执行 source \~/.bash_profile 使其生效。

调用示例

package main
 
/*
   #cgo CFLAGS: -I.
   #cgo LDFLAGS: -L. -lsdk
   #include <stdio.h>
   #include "libsdk.h"
*/
import "C"
import(
    "fmt"
)
 
func main() {
    Query()
}
 
func Query() {
    C.OnLineUpgrade("lid", "sn", "key", "salt", 0)
    para: = "freescanonline.com,info.flnet.org,baidu.com,yui.90.kl"
    result: = C.QueryIOC(para)
    ans: = C.GoString(result)
    defer C.free(unsafe.Pointer(result)) // 注意使用后需要释放,否则在一个不间断的服务中调用动态库会内存泄漏
    fmt.Println(ans)
}