Cgo неопределенная ссылка - PullRequest
       105

Cgo неопределенная ссылка

0 голосов
/ 06 августа 2020

Почему функция c не распознается в моем файле. go при использовании Cgo? Я следил за всем процессом и пробовал пример на godo c, он работал, но этот не работает, в чем причина?

структура папок

libsha .a

sha. cpp

sha.o

sha.h

main. go

Код

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

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 не распознается?

1 Ответ

1 голос
/ 07 августа 2020

Ваш sha.cpp файл не C файл, это C++ файл. По умолчанию это означает, что при компиляции у него не будет связи C, то есть CGo не будет возможности вызвать его.

Проверить { ссылка } для получения дополнительной информации о том, почему он не работает по умолчанию.

Решения

  1. Если sha.cpp можно легко преобразовать в чистый файл C, это будет самый простой. В случае с вашим кодом выше, мне показалось, что просто переименование его в sha.c сработало.
  2. Если это невозможно, посмотрите сообщение: Как использовать C ++ в Go

Предостережения:

Мне пришлось провести небольшой рефакторинг, чтобы заставить это работать, поскольку мне не хватало многих определений, используемых в ваших примерах кода.

  • Я не мог попробовать это с libsha.a, и мне пришлось переопределить все типы U*, поскольку у меня не было файла (например, U8 -> uint8_t).
  • Мне пришлось удалить функции, кроме SHA_Init, так как их реализации не были указаны.
  • Я переименовал все INIT_H* целые числа в sha.cpp в некоторую константу, чтобы скомпилировать.
  • Я тестировал это на Ma c и использовал clang, однако запуск вашего кода дал мне аналогичную ошибку, поэтому я считаю, что решение будет аналогичным.
...