6
Nim'de oluşturulan bazı kodları bir Go uygulamasına statik olarak bağlamak için Linux'ta çalışıyorum. Nim Backend Integration belgelerini ve C'yi Go'ya bağlamanız için bazı makaleleri izledim, ancak işe yaramadı. İşteNim kodunun Go 'ye statik olarak bağlanması
ben de bugüne kadar olduğum yerde ... var
Nim kodu target.nim
:
nim c --app:staticLib --noMain --header target.nim
Git kodu:
proc testnim* {.exportc.} =
echo "In Nim!"
Ben ile derlemek 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()
}
bunlardan ikisi de bina çalıştı:
go build
go build --ldflags '-extldflags "-static"' app.go
İşte ne olsun:
# 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 statusYani ben bir şey (ler) kaçırıyorum. Go 1.5 ve Nim 0.11.3 kullanıyorum (devel dalı). Herhangi bir tavsiye veya ipucu çok takdir edilecektir.
'/ my/path/to/target/libtarget.a 'öğesinin kendi başına
-ldl
ekleyin, geçerli bir LDFLAG değil. Ayrıca, * tüm * gerekli kütüphaneleri özellikle bağlamanız gerekir, yani 'dlclose', 'dlopen' vb. Için libdl 'ye ve – JimB' a bağlandığınızda ve doğrudan şu adrese bağlandığınız sayfadan '-ldl'ye ihtiyacınız var: > Linux sistemlerinde, muhtemelen gerekli dlopen işlevselliğini bağlamak için de kullanmanız gerekecektir. " – JimB
@JimB: Teşekkürler. Bunun çoğu Yunanca bana. Bu önerileri deneyeceğim. –