CGO未定义参考

已知:

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

文件夹结构

libsha.a

sha.cpp

main.go

#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了解更多有关默认情况下为何无法正常运行的信息。

解决方案

  1. 如果sha.cpp可以轻松转换为纯C文件,那将是最简单的。对于上面的代码,只需将其重命名为sha.c似乎对我有用。
  2. 如果那不可行,请查看以下文章:如何在Go中使用C ++

注意事项:

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

  • 我无法使用进行尝试libsha.a,并且U*由于我没有文件而不得不重新定义所有类型(例如U8-> uint8_t)。
  • 除了SHA_Init没有给出实现,我不得不删除函数
  • 为了进行编译,我将所有INIT_H*int 重命名sha.cpp为一些常量。
  • 我在Mac上对此进行了测试,并使用clang,但是运行代码给了我类似的错误,因此我相信解决方案将是相似的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章