Возможно ли это?
У меня есть следующая функция Go, которую я хотел бы вызвать из программы на C:
// package name: test
package main
import "C"
//export Start
func Start() {
println("Hello world")
}
func main() {
}
Я использую следующую команду для создания архива
go build -buildmode=c-archive -o test.a main.go
Используя gcc, я могу заставить работать эту программу на C:
#include <stdio.h>
#include "test.h"
int main() {
Start();
return 0;
}
Я использую следующую команду для сборки исполняемого файла:
gcc main.c sdlgotest.a -o main -lpthread
Все это прекрасно работает для amd64, но я хотел бы использовать этот архив в среде разработки с таргетингом на aarch64 (используя libtransistor )
libtransistorСистема сборки использует LLVM, но имеет собственный набор стандартных включений (libc и т. д.) и не использует glibc.
Так что, когда я пытаюсь получить libtransistor для связи моего архива, я получаю следующееошибки:
/usr/lib/llvm-5.0/bin/ld.lld: error: undefined symbol: stderr
>>> referenced by gcc_libinit.c:29
>>> 000006.o:(x_cgo_sys_thread_create) in archive ./sdlgotest.a
/usr/lib/llvm-5.0/bin/ld.lld: error: undefined symbol: stderr
>>> referenced by gcc_libinit.c:29
>>> 000006.o:(x_cgo_sys_thread_create) in archive ./sdlgotest.a
Кстати, libtransistor компилирует код с такими флагами:
-nostdlib -nostdlibinc -isystem /opt/libtransistor/include/
Так что я думаю, проблема в том, что компоновщик может 'разрешить эти символы glibc.
Есть ли способ скомпилировать среду выполнения Go без этих glibcсимволы, чтобы я мог использовать архив, как я собираюсь?(без использования GCC toolchain или glibc)