Как мне получить cgo для создания объектных файлов без определения main()?

У меня есть проект, написанный полностью на C. Мне просто нужно вызвать одну функцию, которая должна быть закодирована в GO. Поэтому я использую cgo для создания C-файлов, а затем я хотел бы использовать полученные объектные файлы для связи с моим основным C-проектом.

Предположим, у меня есть один файл foo.go с одной функцией func HelloWorld(), Я хочу выполнить эту функцию из моего C-кода.

Поэтому я делаю следующие шаги

# go tool cgo foo.go
# cd _obj && gcc -c *.o

Теперь у меня есть два файла:

# _cgo_export.o  _cgo_main.o

Тем не мение, main() там как-то определяется, и я не могу связать эти объектные файлы с моим основным проектом (несколько сетей).

Как я могу получить Cgo, чтобы не положить в пустышку? Или я делаю это совершенно неправильно?

РЕДАКТИРОВАТЬ Мне нужно, чтобы точка входа была в C. Предложения, опубликованные другими, требуют, чтобы точка входа была в GO. Я разместил правильное решение ниже, благодаря другому пользователю, которого я зачислил.

1 ответ

Решение

Ответ от @alexander ( Alexander) решил проблему.

Это не запутанное предложение, если вы используете gccgo. Это работает здесь:

foo.go

package main

func Add(a, b int) int {
    return a + b
}

bar.c

#include <stdio.h>

extern int go_add(int, int) __asm__ ("example.main.Add");

int main() {
  int x = go_add(2, 3);
  printf("Result: %d\n", x);
}

Makefile

all: main

main: foo.o bar.c
    gcc foo.o bar.c -o main

foo.o: foo.go
    gccgo -c foo.go -o foo.o -fgo-prefix=example

clean:
    rm -f main *.o
Другие вопросы по тегам