Home >Backend Development >Golang >How to specify relative dylib paths in cgo on macOS

How to specify relative dylib paths in cgo on macOS

WBOY
WBOYforward
2024-02-08 22:10:27801browse

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

It is a common problem when using cgo on macOS and specifying relative dylib paths. cgo is a tool used by the Go language to interact with the C language, while dylib is a dynamic link library on macOS. Specifying relative paths makes your project more flexible and portable. So, how should we specify relative dylib paths in cgo on macOS? PHP editor Strawberry will answer you in detail.

Question content

I'm currently trying to get an existing dylib written in c to work in go. For this I use cgo and everything compiles correctly. When go build tries to run the generated executable dyld , it cannot find dylib located in the go source directory.

I'm using these cflags and ldflags with no success:

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

I also learned that I can use the magic string @executable_path to specify a relative library search path, but adding it to -l or trying to add -install_name to the linker flags yields nothing .

This is the linker error message I receive:

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

While not adding any build steps outside of go, how do I properly configure cgo to use the dylib located in the same folder where the binary is later located so that it can be run with go build?

Workaround

It turns out I was very close to my goal, but the search path stored in the actual library was wrong.

The code in my question works fine after modifying the library as follows:

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

While I haven't found a clean way to let goland control the go build and copy my libraries to the output directory of the running application, I tentatively copied the dependencies by setting the output directory to an absolute path and adding Pre-execution command to the output folder.

The above is the detailed content of How to specify relative dylib paths in cgo on macOS. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete