Cgo未定义引用

Cgo未定义引用,go,cgo,Go,Cgo,为什么在使用Cgo时,我的.go文件中无法识别c函数? 我遵循了所有的流程,并在godoc上尝试了这个示例,它起了作用,但这一个不起作用,原因是什么 文件夹结构 libsha.a sha.cpp 沙奥 沙赫 梅因,加油 代码 sha.h #ifndef _SHA_H_ #define _SHA_H_ #include <stdlib.h> #include "TYPE.h" typedef struct { U32 bits[2]; U32 i

为什么在使用Cgo时,我的.go文件中无法识别c函数? 我遵循了所有的流程,并在godoc上尝试了这个示例,它起了作用,但这一个不起作用,原因是什么

文件夹结构

libsha.a

sha.cpp

沙奥

沙赫

梅因,加油

代码

sha.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);

#endif
main.go

package 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函数?

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

查看更多信息,了解为什么默认情况下它不起作用

解决
  • 如果
    sha.cpp
    可以很容易地转换为纯
    C
    文件,那将是最简单的。在上面的代码中,简单地将其重命名为
    sha.c
    似乎对我有用
  • 如果不可行,请查看帖子:
  • 注意事项: 我必须进行一些重构才能使其正常工作,因为我缺少代码示例中使用的许多定义

    • 我无法使用
      libsha.a
      尝试此操作,并且必须重新定义所有
      U*
      类型,因为我没有该文件(例如
      U8
      ->
      uint8\t
    • 我不得不删除
      SHA_Init
      之外的函数,因为它们的实现没有给出
    • 为了编译,我将
      sha.cpp
      中的所有
      INIT\u H*
      int重命名为某个常量
    • 我在Mac上测试了这个,并使用了
      clang
      ,但是运行您的代码会给我一个类似的错误,所以我相信解决方案也会类似

    • 谢谢你,约翰,你说得对,我应该试试你为C++和GO共享的链接,但我认为它会让编译痛苦!!!我应该试着把它转换成C或者在C中重新编程代码,调用.h文件
      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