首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cgo未定义引用

Cgo未定义引用
EN

Stack Overflow用户
提问于 2020-08-06 09:16:07
回答 1查看 2.1K关注 0票数 0

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

文件夹结构

libsha.a

sha.cpp

sha.o

sha.h

main.go

sha.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
  #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

代码语言:javascript
复制
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))

}

误差

代码语言:javascript
复制
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函数不被识别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 21:06:04

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

查看https://stackoverflow.com/a/1041880/2911436,了解为什么默认情况下它不能工作的更多信息。

解决方案

如果

  1. 可以轻松地将sha.cpp转换为纯C文件,那将是最简单的。在上面的代码中,简单地将它重命名为sha.c似乎对我有效。

注意事项:

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

我无法用一个uint8_t).

  • I来尝试这一点,并且必须重新定义所有的U*类型,因为我没有这个文件(例如,U8 ->

  • 必须删除除了SHA_Init之外的函数,因为它们的实现没有给出。

  • ,我将sha.cpp中的所有INIT_H* ints重新命名为一些常量以便编译。H 227H 128我在Mac上测试了这一点,并使用了clang,然而,运行您的代码给了我一个类似的错误,所以我相信解决方案将是相似的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63280472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档