我正在Linux上尝试将Nim语言编写的代码静态链接到Go应用程序中。我已经遵循了Nim后端集成文档和一些关于在Go中链接C的文章,但还没有让它正常工作。
目前进展如下:
Nim代码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
这是我的理解:
# 命令行参数 /my/path/to/target/libtarget.a(stdlib_system.o):在函数“nimUnloadLibrary”中: stdlib_system.c:(.text+0xe6f0):未定义引用“dlclose” /my/path/to/target/libtarget.a(stdlib_system.o):在函数“nimLoadLibrary”中: stdlib_system.c:(.text+0xe71b):未定义引用“dlopen” /my/path/to/target/libtarget.a(stdlib_system.o):在函数“nimGetProcAddr”中: stdlib_system.c:(.text+0xe750):未定义引用“dlsym” collect2: 错误:ld返回1个退出状态
所以我缺少某些东西。我正在使用Go 1.5和Nim 0.11.3(devel分支)。非常感谢任何建议或提示。
/my/path/to/target/libtarget.a
单独使用并不是一个有效的 LDFLAG。您还需要明确链接 所有 所需的库,即您需要-ldl
来链接到dlclose
、dlopen
等的 libdl。 - JimBapp.go
文件中添加#cgo LDFLAGS: -ldl
,它可以工作,但只有在保留无效的#cgo LDFLAGS: /my/path/to/target/libtarget.a
的情况下才能工作。有什么想法为什么会这样或者应该如何/在哪里包含它以正确完成? - Lye Fish