【问题标题】:Statically linking Nim code to Go将 Nim 代码静态链接到 Go
【发布时间】:2015-09-11 06:44:12
【问题描述】:

我正在尝试在 Linux 中将在 Nim 中创建的一些代码静态链接到 Go 应用程序中。我已经关注了 Nim Backend Integration 文档和一些在 Go 中链接 C 的文章,但没有得到它的工作。

这是我目前所处的位置......


尼姆代码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(开发分支)。任何建议或提示将不胜感激。

【问题讨论】:

  • /my/path/to/target/libtarget.a 本身不是有效的 LDFLAG。您还需要专门链接 所有 需要的库,即您需要 -ldl 链接到 libdl 以获取 dlclosedlopen 等。
  • 并直接从您链接到的页面:>“例如,在 Linux 系统上,您可能还需要使用 -ldl 来链接所需的 dlopen 功能。”
  • @JimB:谢谢。这对我来说大部分都是希腊语。我会试试这些建议。
  • @JimB:再次感谢。它通过将#cgo LDFLAGS: -ldl 添加到app.go 文件来工作,但只有在我保留无效的#cgo LDFLAGS: /my/path/to/target/libtarget.a 时才有效。知道为什么会这样,或者应该如何/在哪里正确完成吗?
  • 忘记了你可以像这样直接将文件传递给 gcc。我不确定使用-L /path/to/target -ltarget 是否更好。选择哪个有效???????

标签: go nim-lang


【解决方案1】:

您缺少 libdl 库。将-ldl 添加到您的 LDFLAGS

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 2022-12-23
    • 2018-11-25
    • 2011-04-02
    • 2013-01-25
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多