為什么使用 Cgo 時我的 .go 文件中無法識別 c 函數(shù)?我遵循了所有過程并嘗試了godoc上的示例,它可以工作,但是這個不起作用,是什么原因?文件夾結(jié)構(gòu)libsha.asha.cpp掃碼沙.hmain.go代碼沙.h#ifndef _SHA_H_#define _SHA_H_#include <stdlib.h>#include "TYPE.h"typedef struct { U32 bits[2]; U32 input[16]; U32 state[5];} SHA_CTX;void SHA_Init(SHA_CTX *ctx);void SHA_Update(SHA_CTX *ctx, U8 *in, int inbytes);void SHA_Final(SHA_CTX *ctx, U8 *out);void KS_SHA(U8 *out, U8 *in, int inbytes);#endifsha.cpp #include "sha.h" void SHA_Init(SHA_CTX *ctx) { ctx->state[0] = INIT_H0; ctx->state[1] = INIT_H1; ctx->state[2] = INIT_H2; ctx->state[3] = INIT_H3; ctx->state[4] = INIT_H4; ctx->bits[0] = ctx->bits[1] = 0; }main.gopackage main// #cgo LDFLAGS: -L . -lsha// #include "sha.h"import "C"import "unsafe"type CPoint struct { Point C.struct_SHA_CTX}func main() { point := CPoint{Point: C.struct_SHA_CTX{}} C.SHA_Init(point) defer C.free(unsafe.Pointer(point))}錯誤C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: $WORK\b001\_x002.o: in function `_cgo_6280fd3fea2a_Cfunc_SHA_Init':/tmp/go-build/cgo-gcc-prolog:49: undefined reference to `SHA_Init'collect2.exe: error: ld returned 1 exit status為什么無法識別 SHA_Init 函數(shù)?
1 回答
慕尼黑的夜晚無繁華
TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個贊
您的sha.cpp文件不是C文件,而是C++文件。默認(rèn)情況下,這意味著在編譯時,它不會有 C 鏈接,這意味著 CGo 將無法調(diào)用它。
查看https://stackoverflow.com/a/1041880/2911436以了解有關(guān)默認(rèn)情況下它為何不起作用的更多信息。
解決方案
如果
sha.cpp可以輕松轉(zhuǎn)換為純C文件,那將是最簡單的。對于上面的代碼,只需將其重命名為sha.c似乎對我有用。如果這不可行,請查看帖子:如何在 Go 中使用 C++
注意事項:
我必須進(jìn)行一些重構(gòu)才能使其正常工作,因?yàn)槲胰鄙倌拇a示例中使用的許多定義。
我不能用 a 來嘗試這個
libsha.a,并且必須重新定義所有U*類型,因?yàn)槲覜]有文件(例如U8->uint8_t)。SHA_Init除了沒有給出它們的實(shí)現(xiàn)之外,我不得不刪除函數(shù)。為了編譯,我將所有
INIT_H*int重命名為常量。sha.cpp我在 Mac 上對此進(jìn)行了測試,并使用了
clang,但是運(yùn)行您的代碼給了我一個類似的錯誤,所以我相信解決方案會是類似的。
- 1 回答
- 0 關(guān)注
- 431 瀏覽
添加回答
舉報
0/150
提交
取消
