Сборка Go с интерфейсом C для Gtk+

Я пытаюсь создать программу Go, которая использует внешний код C в качестве интерфейса для Gtk+.

Вот основной код Go, который у меня есть (ui.h.go):

package main

//#cgo pkg-config: gtk+-3.0
//#include "ui.h"
import "C"

func CInit() {
    C.Init(nil, 0)
}

func CMain() {
    C.Main()
}

func CShowWindow() {
    C.ShowWindow()
}

func main() {
    CInit()
    CShowWindow()
    CMain()
}

Код на C компилируется из vala в объектный файл (ui.o) и файл заголовка (ui.h):

#ifndef __UI_H__
#define __UI_H__

#include <glib.h>
#include <stdlib.h>
#include <string.h>

G_BEGIN_DECLS

void ShowWindow (void);
void Init (gchar** args, int args_length1);
void Main (void);

G_END_DECLS

#endif

Когда я пытаюсь go build ui.h.go Я получил:

# command-line-arguments
/tmp/go-build916459533/command-line-arguments/_obj/ui.h.cgo2.o: In function `_cgo_80fc53cbf347_Cfunc_Init':
./ui.h.go:37: undefined reference to `Init'
/tmp/go-build916459533/command-line-arguments/_obj/ui.h.cgo2.o: In function `_cgo_80fc53cbf347_Cfunc_Main':
./ui.h.go:46: undefined reference to `Main'
/tmp/go-build916459533/command-line-arguments/_obj/ui.h.cgo2.o: In function `_cgo_80fc53cbf347_Cfunc_ShowWindow':
./ui.h.go:55: undefined reference to `ShowWindow'
collect2: error: ld returned 1 exit status

Что логично, я не предоставил свой объектный файл. Но если я укажу это в заголовке cgo ui.h.go как это...

//#cgo LDFLAGS: ui.o
//#cgo pkg-config: gtk+-3.0
//#include "ui.h"
import "C"

Я получаю многократную ошибку определения, как будто она связана дважды.

# command-line-arguments
/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
ui.o:(.bss+0x0): multiple definition of `window'
/tmp/go-link-461834384/000000.o:/home/oleg/Документы/Projects/rasp/ui.h.go:38: first defined here
ui.o: In function `ShowWindow':
ui.c:(.text+0x0): multiple definition of `ShowWindow'
/tmp/go-link-461834384/000000.o:(.text+0x25): first defined here
ui.o: In function `Init':
ui.c:(.text+0x29): multiple definition of `Init'
/tmp/go-link-461834384/000000.o:(.text+0x4e): first defined here
ui.o: In function `Main':
ui.c:(.text+0x116): multiple definition of `Main'
/tmp/go-link-461834384/000000.o:(.text+0x13b): first defined here
collect2: error: ld returned 1 exit status

Как правильно связать мой файл ui.o с программой Go? Спасибо.

1 ответ

Решение

Ну, я понял, что cgo хорошо связывается со статическими библиотеками. Поэтому я решил заархивировать мой ui.o в libui.a и связать его, используя #cgo LDFLAGS: -L. -lui и это сработало правильно.

Другие вопросы по тегам