卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34353本站已运行393

如何在 macOS 上的 cgo 中指定相对 dylib 路径

如何在 macos 上的 cgo 中指定相对 dylib 路径

在 macOS 上使用 cgo 并指定相对 dylib 路径是一个常见的问题。 cgo 是 Go 语言用于与 C 语言进行交互的工具,而 dylib 是 macOS 上的动态链接库。指定相对路径可以使项目更加灵活和可移植。那么,我们应该如何在 macOS 上的 cgo 中指定相对 dylib 路径呢?php小编草莓将为您详细解答。

问题内容

我目前正在尝试让一个用 c 编写的现有 dylib 在 go 中工作。 为此,我使用 cgo 并且一切都可以正确编译。 当 go build 尝试运行生成的可执行文件 dyld 时,找不到位于 go 源目录中的 dylib。

我正在使用这些 cflags 和 ldflags 但没有成功:

// #cgo cflags: -i${srcdir}
// #cgo ldflags: -l. -lmylibrary

我还了解到我可以使用魔术字符串 @executable_path 来指定相对库搜索路径,但将其添加到 -l 或尝试将 -install_name 添加到链接器标志不会产生任何结果。

这是我收到的链接器错误消息:

/Users/benedikt/sdk/go1.19.7/bin/go build -o /private/var/folders/.../T/GoLand/___1go_build_myapp myapp #gosetup
/private/var/folders/.../T/GoLand/___1go_build_myapp
dyld[58935]: Library not loaded: '/usr/local/lib/libMyLibrary.dylib'
  Referenced from: '/private/var/folders/.../T/GoLand/___1go_build_myapp'
  Reason: tried: '/usr/local/lib/libMyLibrary.dylib' (no such file), '/usr/lib/libMyLibrary.dylib' (no such file)

虽然没有在 go 之外添加任何构建步骤,但如何正确配置 cgo 以使用位于二进制文件稍后所在的同一文件夹中的 dylib,以便它可以与 go build 一起运行?

解决方法

事实证明我已经非常接近我的目标,但实际库中存储的搜索路径是错误的。

我的问题中的代码在修改库后工作正常,如下所示:

install_name_tool -id @loader_path/libMyLibrary.dylib libMyLibrary.dylib

虽然我还没有找到一种干净的方法来让 goland 控制 go build,将我的库复制到运行应用程序的输出目录,但我初步通过将输出目录设置为绝对路径并添加将依赖项复制到输出文件夹的预执行命令。

卓越飞翔博客
上一篇: 如何检查 go template 是否使用了所有模板数据
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏