2015-09-10 15 views
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 status 
Yani 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.

+1

'/ 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

+2

' 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

+0

@JimB: Teşekkürler. Bunun çoğu Yunanca bana. Bu önerileri deneyeceğim. –

cevap

3

Libdl kitaplığını kaçırıyorsunuz. LDFLAGS