为了账号安全,请及时绑定邮箱和手机立即绑定

Cgo 未定义引用

Cgo 未定义引用

Go
梦里花落0921 2022-06-21 16:31:42
为什么使用 Cgo 时我的 .go 文件中无法识别 c 函数?我遵循了所有过程并尝试了godoc上的示例,它可以工作,但是这个不起作用,是什么原因?文件夹结构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 函数?
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

您的sha.cpp文件不是C文件,而是C++文件。默认情况下,这意味着在编译时,它不会有 C 链接,这意味着 CGo 将无法调用它。

查看https://stackoverflow.com/a/1041880/2911436以了解有关默认情况下它为何不起作用的更多信息。

解决方案

  1. 如果sha.cpp可以轻松转换为纯C文件,那将是最简单的。对于上面的代码,只需将其重命名为sha.c似乎对我有用。

  2. 如果这不可行,请查看帖子:如何在 Go 中使用 C++

注意事项:

我必须进行一些重构才能使其正常工作,因为我缺少您的代码示例中使用的许多定义。

  • 我不能用 a 来尝试这个libsha.a,并且必须重新定义所有U*类型,因为我没有文件(例如U8-> uint8_t)。

  • SHA_Init除了没有给出它们的实现之外,我不得不删除函数。

  • 为了编译,我将所有INIT_H*int重命名为常量。sha.cpp

  • 我在 Mac 上对此进行了测试,并使用了clang,但是运行您的代码给了我一个类似的错误,所以我相信解决方案会是类似的。


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 372 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号