почему выдаёт ошибку go: no Go source files с использованием библиотеки C

package main

import (
    "fmt"
    "C"
)

//export Sum
func Sum(a, C.int, b C.int) C.int {
    fmt.Printf("go program")
    return a + b
}


func main(){}

при вводе команды go build -o sum.dll -buildmode=c-shared examp.go выдаёт ошибку:

go: no Go source files

я пытался переносить код в файл main.go, всё аналогично


Ответы (1 шт):

Автор решения: Pak Uula

Это расширенный комментарий.

Если коротко, то ваша программа успешно (после небольшой правки) скомпилирована и вызвана из Си.

Развёрнуто.

  1. Тулчейн Го: go version go1.24.2 windows/amd64
  2. Тулчейн Cи: MSYS2 gcc (ucrt64/mingw-w64-ucrt-x86_64-gcc 14.2.0-2 (mingw-w64-ucrt-x86_64-toolchain))

Файлы

examp.go

package main

import (
    "C"
    "fmt"
)

//export Sum
func Sum(a C.int, b C.int) C.int {
    fmt.Println("-> go program")
    return a + b
}

func main() {}

main.c

#include <windows.h>
#include <stdio.h>
#include "sum.h"

typedef int (*SumFunc)(int, int);

int main() {
    HMODULE hDll = LoadLibrary("sum.dll");
    if (!hDll) {
        // Тексты на английском, чтобы не было проблем с кодировкой терминала
        printf("Error loading DLL\n");
        return 1;
    }

    SumFunc Sum = (SumFunc)GetProcAddress(hDll, "Sum");
    if (!Sum) {
        printf("Function Sum not found\n");
        FreeLibrary(hDll);
        return 1;
    }

    printf("Calling function Sum\n");
    int result = Sum(2, 3);
    printf("Sum(2, 3) = %d\n", result);

    FreeLibrary(hDll);
    return 0;
}

Сборка

go build -o sum.dll -buildmode=c-shared examp.go

Сгенерированы sum.dll и sum.h

gcc main.c -o main.exe

Запуск .\main.exe:

Calling function Sum
-> go program
Sum(2, 3) = 5

Видно, что го-функция Sum успешно вызвана из Си.

→ Ссылка