簡體   English   中英

無法在Golang應用程序中使用通過cgo編譯的C庫?

[英]Cannot use already compiled C library using cgo in Golang application?

我正在嘗試在Golang中包裝一個C庫。 我正在嘗試在已編譯的庫中調用C函數。 我同時有一個.a文件和.so庫文件。

我需要在哪里放置庫文件,如何告訴cgo我正在使用這些庫?

我是C語言的新手。非常感謝您的幫助。

我將通過以下示例進行解釋:

首先建立libhello.a使用./libs/mc

#include <stdint.h> 

extern uint64_t Add(uint64_t a, uint64_t b) {
    return a + b;
}

對於此測試示例, libhello.a位於./libs/

m.go
└───libs
    m.c
    libhello.a

然后go buildm.go工作示例:

package main

//#cgo LDFLAGS: -L${SRCDIR}/libs -lhello
//#include <stdint.h>
//extern uint64_t Add(uint64_t a, uint64_t b);
import "C"

import (
    "fmt"
)

func main() {
    fmt.Println(C.Add(C.uint64_t(10), C.uint64_t(20))) // 30
}

輸出:

30

解析cgo指令后,任何出現的字符串$ {SRCDIR}都將替換為包含源文件的目錄的絕對路徑。 這樣可以將預編譯的靜態庫包含在包目錄中並正確鏈接。 例如,如果軟件包foo位於/ go / src / foo目錄中:

 // #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo 

將擴展為:

 // #cgo LDFLAGS: -L/go/src/foo/libs -lfoo 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM