How to specify relative dylib paths in cgo on macOS

WBOY
Release: 2024-02-08 22:10:27
forward
737 people have browsed it

如何在 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
Copy after login

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)
Copy after login

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
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!