go - Cgo undefined reference

标签 go cgo

为什么使用 Cgo 时我的 .go 文件中无法识别 c 函数?
我遵循了所有过程并尝试了 godoc 上的示例,它有效但这个不起作用,是什么原因?
文件夹结构
libsha.a
sha.cpp
扫码
沙.h
main.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);

#endif
sha.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.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 将无法调用它。
查看 https://stackoverflow.com/a/1041880/2911436有关为什么默认情况下它不起作用的更多信息。
解决方案

  • 如果 sha.cpp可以很容易地转换为纯 C文件,这将是最简单的。对于上面的代码,只需将其重命名为 sha.c似乎对我有用。
  • 如果这不可行,请查看帖子:How to use C++ in Go

  • 注意事项:
    我必须进行一些重构才能使其正常工作,因为我缺少您的代码示例中使用的许多定义。
  • 我无法使用 libsha.a 尝试此操作,并且不得不重新定义所有 U*类型,因为我没有文件(例如 U8 -> uint8_t )。
  • 我不得不删除 SHA_Init 之外的函数因为没有给出他们的实现。
  • 我重命名了所有 INIT_H* sha.cpp 中的整数为了编译是一些常数。
  • 我在 Mac 上对此进行了测试,并使用了 clang ,但是运行你的代码给了我一个类似的错误,所以我相信解决方案会是相似的。
  • 关于go - Cgo undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63280472/

    相关文章:

    go - golang `range` 关键字是否破坏了 uint 类型信息?

    go - 从另一个文件调用函数失败

    memory-management - CGO:如何使用 malloc 从 go 中释放在 C 中分配的内存以避免内存泄漏

    c - Go cgo ldap_init 无法确定 C.ldap_init 的名称类型

    java - 如何在Windows上的bazel中使用rules_go : generate . so文件

    go - 为什么我的普罗米修斯标签不显示?

    go - Golang将slice append 到slice的slice上,那么slice会一直影响slice的slice吗?

    c++ - 自从在 Golang 中删除了一些 C 之后,SWIG for go 是否已经过时了?

    c++ - Cgo 生成的源代码无法在 MVC 上编译

    戈朗 : How can i access json decoded field?