Статическая привязка кода Nim к Go

Я пытаюсь в Linux статически связать некоторый код, созданный в Nim, с приложением Go. Я следил за документацией Nim Backend Integration и некоторыми статьями о компоновке C в Go, но не не заработало.

Вот где я нахожусь до сих пор ...


Ним код target.nim:

proc testnim* {.exportc.} =
  echo "In Nim!"

Я компилирую его с помощью:

nim c --app:staticLib --noMain --header target.nim

Перейти по коду app.go:

package main

/*
#cgo CFLAGS: -I/my/path/to/target/nimcache
#cgo CFLAGS: -I/my/path/to/Nim/lib
#cgo LDFLAGS: /my/path/to/target/libtarget.a
#include "/my/path/to/target/nimcache/target.h"
*/
import "C"
import "fmt"

func main() {
  fmt.Println("In Go!")
  C.NimMain()
  C.testnim()
}

Я попытался построить оба из них:

go build

go build --ldflags '-extldflags "-static"' app.go

Вот что я получаю:

# command-line-arguments
/my/path/to/target/libtarget.a(stdlib_system.o): In function `nimUnloadLibrary':
stdlib_system.c:(.text+0xe6f0): undefined reference to `dlclose'
/my/path/to/target/libtarget.a(stdlib_system.o): In function `nimLoadLibrary':
stdlib_system.c:(.text+0xe71b): undefined reference to `dlopen'
/my/path/to/target/libtarget.a(stdlib_system.o): In function `nimGetProcAddr':
stdlib_system.c:(.text+0xe750): undefined reference to `dlsym'
collect2: error: ld returned 1 exit status

Так что я что-то пропустил(а). Я использую Go 1.5 и Nim 0.11.3 (ветвь разработки). Любые советы или подсказки будут высоко оценены.


person Lye Fish    schedule 10.09.2015    source источник
comment
/my/path/to/target/libtarget.a сам по себе не является допустимым LDFLAG. Вам также необходимо специально связать все необходимые библиотеки, т. е. вам нужно -ldl связать с libdl для dlclose, dlopen и т. д.   -  person JimB    schedule 11.09.2015
comment
и непосредственно со страницы, на которую вы ссылаетесь: › например, в системах Linux вам, вероятно, также потребуется использовать -ldl для ссылки на необходимые функции dlopen.   -  person JimB    schedule 11.09.2015
comment
@JimB: Спасибо. Многое из этого для меня греческое. Я попробую эти предложения.   -  person Lye Fish    schedule 11.09.2015
comment
@JimB: Еще раз спасибо. Это работает, добавляя #cgo LDFLAGS: -ldl в файл app.go, но работает только в том случае, если я сохраняю недействительный #cgo LDFLAGS: /my/path/to/target/libtarget.a. Любая идея, почему это было бы или как/где это должно быть включено, чтобы это было правильно сделано?   -  person Lye Fish    schedule 11.09.2015
comment
Забыл, что вы можете передавать файлы напрямую в gcc. Я не уверен, что лучше использовать -L /path/to/target -ltarget. Берите то, что работает ????????   -  person JimB    schedule 11.09.2015
comment
@JimB: Отлично, спасибо. Если вы хотите опубликовать ответ о моем -ldl упущении, я приму его. Спасибо еще раз.   -  person Lye Fish    schedule 11.09.2015


Ответы (1)


Вам не хватает библиотеки libdl. Добавьте -ldl к своим LDFLAGS

person JimB    schedule 10.09.2015