Как мне получить 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