将Nim代码静态链接到Go

8

我正在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分支)。非常感谢任何建议或提示。


1
/my/path/to/target/libtarget.a 单独使用并不是一个有效的 LDFLAG。您还需要明确链接 所有 所需的库,即您需要 -ldl 来链接到 dlclosedlopen 等的 libdl。 - JimB
2
例如,在Linux系统上,您可能还需要使用-ldl来链接所需的dlopen功能。 - JimB
@JimB:谢谢。这里的很多内容对我来说都是希腊文,我会尝试你的建议。 - Lye Fish
@JimB:再次感谢。通过在app.go文件中添加#cgo LDFLAGS: -ldl,它可以工作,但只有在保留无效的#cgo LDFLAGS: /my/path/to/target/libtarget.a的情况下才能工作。有什么想法为什么会这样或者应该如何/在哪里包含它以正确完成? - Lye Fish
忘记了可以这样直接将文件传递给gcc。我不确定使用“-L /path/to/target -ltarget”是否更好。随便选哪个能工作就行。 - JimB
@JimB:非常好,谢谢。如果您想发表关于我省略了“-ldl”的答案,我会接受它。再次感谢。 - Lye Fish
1个回答

5

你缺少libdl库。在LDFLAGS中添加-ldl


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接