Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Little help? Could not open library 'glib-2.0.0': dlopen(glib-2.0.0, 5): image not found. #284

Closed
bdhartz opened this issue Mar 7, 2021 · 35 comments

Comments

@bdhartz
Copy link

bdhartz commented Mar 7, 2021

Hi team (John? Anyone?) Hoping for some help. I've spent hours on github/stackoverflow trying to triage this issue. Admittedly, I'm new to ruby and very new to getting development environments set up. I am on an M1 mac.

My VIPs-related unit tests fail with the following error:
LoadError: Could not open library 'glib-2.0.0': dlopen(glib-2.0.0, 5): image not found.
Could not open library 'libglib-2.0.0.dylib': dlopen(libglib-2.0.0.dylib, 5): image not found

Would really appreciate any help here. Also would be happy to jump on a zoom call and report findings back here!

Notes from my investigation/previous issues:
(1) #130 - libglib-2.0.dylib is on my system, in a few different places actually. Is the code looking for it somewhere else?

$ locate libglib-2.0.dylib
/opt/homebrew/Cellar/glib/2.66.7/lib/libglib-2.0.dylib
/opt/homebrew/lib/libglib-2.0.dylib
/usr/local/lib/libglib-2.0.dylib
/usr/local/libglib-2.0.dylib

I see the suggestion that I should check:
you have glib and libvips in /usr/local/lib - should they really be here if I'm primarily using brew, which puts things elsewhere? I've tried copying a bunch of files into /usr/local/lib, but I'm not sure exactly which files should be here for l
you can run command-line vips stuff correctly - irb > require 'vips' fails with the error mentioned above.
your gem and Ruby know about /usr/local - how can I check this?

(2) vips --version output:
vips-8.10.5-Fri Dec 18 10:14:09 UTC 2020

(3) I saw some other suggestions (I can't find them now) to modify lib/ffi/library.rb to use a direct path. However,
LIBC = '/usr/lib/libc.dylib' #original value
#LIBC = '/System/DriverKit/usr/lib/system/libsystem_c.dylib' - tried this, didn't work
#LIBC = '/opt/homebrew/Cellar/tcl-tk/8.6.11_1/lib/tcllibc/macosx-arm-clang/tcllibc.dylib' - tried this, didn't work

Interestingly, the output of $ locate libc.dylib is below.
/opt/homebrew/Cellar/tcl-tk/8.6.11_1/lib/tcllibc/macosx-arm-clang/tcllibc.dylib

Looking for any guidance or suggestions. Thank you so much! Apologies if this is posted incorrectly, happy to remove it elsewhere. Thank you!

@jcupitt
Copy link
Member

jcupitt commented Mar 8, 2021

Hi @bdhartz,

It used to "just work", but I've not tried ruby-vips on macos for a while, perhaps things have changed. I'll have a go later today.

@bdhartz
Copy link
Author

bdhartz commented Mar 8, 2021

Hi @bdhartz,

It used to "just work", but I've not tried ruby-vips on macos for a while, perhaps things have changed. I'll have a go later today.

Thanks John, I look forward to hearing back! Let me know if you'd like to hop on a call or if I can provide any further info.

@jcupitt
Copy link
Member

jcupitt commented Mar 8, 2021

Oh, an M1 mac, I just noticed. I think brew is still a bit wobbly on the M1, you might need to wait a few months more before it'll work smoothly.

On this old imac I see:

21:45 $ brew install vips
==> Downloading https://homebrew.bintray.com/bottles/vips-8.10.5_2.catalina.bott
Already downloaded: /Users/john/Library/Caches/Homebrew/downloads/f57d2661c5701c4dfd7dc1bd9c4b9d068a75e845caa9ed5c1abedce79f8f33a7--vips-8.10.5_2.catalina.bottle.tar.gz
==> Pouring vips-8.10.5_2.catalina.bottle.tar.gz
Warning: vips dependency gcc was built with a different C++ standard
library (libstdc++ from clang). This may cause problems at runtime.
🍺  /usr/local/Cellar/vips/8.10.5_2: 167 files, 13.9MB
✔ ~ 
21:46 $ ls -l /usr/local/lib/*vips*
lrwxr-xr-x  1 john  admin  48  8 Mar 21:46 /usr/local/lib/libvips-cpp.42.dylib -> ../Cellar/vips/8.10.5_2/lib/libvips-cpp.42.dylib
lrwxr-xr-x  1 john  admin  41  8 Mar 21:46 /usr/local/lib/libvips-cpp.a -> ../Cellar/vips/8.10.5_2/lib/libvips-cpp.a
lrwxr-xr-x  1 john  admin  45  8 Mar 21:46 /usr/local/lib/libvips-cpp.dylib -> ../Cellar/vips/8.10.5_2/lib/libvips-cpp.dylib
lrwxr-xr-x  1 john  admin  44  8 Mar 21:46 /usr/local/lib/libvips.42.dylib -> ../Cellar/vips/8.10.5_2/lib/libvips.42.dylib
lrwxr-xr-x  1 john  admin  37  8 Mar 21:46 /usr/local/lib/libvips.a -> ../Cellar/vips/8.10.5_2/lib/libvips.a
lrwxr-xr-x  1 john  admin  41  8 Mar 21:46 /usr/local/lib/libvips.dylib -> ../Cellar/vips/8.10.5_2/lib/libvips.dylib
✔ ~ 
21:49 $ gem install ruby-vips
Fetching ruby-vips-2.1.0.gem
Successfully installed ruby-vips-2.1.0
Parsing documentation for ruby-vips-2.1.0
Installing ri documentation for ruby-vips-2.1.0
Done installing documentation for ruby-vips after 0 seconds
1 gem installed
✔ ~ 
21:49 $ irb
irb(main):001:0' require 'vips'
=> true
irb(main):002:0> 

@jonfer
Copy link

jonfer commented Mar 29, 2021

I have the same problem, with an M1 as well. Let me know if you find a solution. Thank you

@jcupitt
Copy link
Member

jcupitt commented Mar 30, 2021

Sorry, I don't know what's wrong with your system. I did the most basic install and it all worked. Are you maybe attempting to use the Apple ruby? It blocks third party libraries for security. You must use the homebrew ruby.

On my mac (2012 imac), I see this:

10:49 $ which ruby
/usr/local/opt/ruby/bin/ruby
✔ ~ 
10:49 $ which vips
/usr/local/bin/vips
✔ ~ 

So I used brew to install vips and ruby and they are both in /usr/local.

10:50 $ ls /usr/local/lib/libglib*
/usr/local/lib/libglib-2.0.0.dylib /usr/local/lib/libglib-2.0.dylib
/usr/local/lib/libglib-2.0.a
✔ ~ 
10:50 $ ls /usr/local/lib/libvips*
/usr/local/lib/libvips-cpp.42.dylib /usr/local/lib/libvips.42.dylib
/usr/local/lib/libvips-cpp.a        /usr/local/lib/libvips.a
/usr/local/lib/libvips-cpp.dylib    /usr/local/lib/libvips.dylib
✔ ~ 

The relevant libraries are in there too.

10:50 $ vips --help
Usage:
  vips [OPTION…] [ACTION] [OPTIONS] [PARAMETERS] - VIPS driver program
...

I can run the vips command-line stuff.

10:50 $ irb
irb(main):001:0> require 'vips'
=> true
irb(main):002:0> 

And I can gem install ruby-vips and require it.

@bdhartz
Copy link
Author

bdhartz commented Mar 30, 2021

I think @jonfer is having an issue on a mac with M1/silicon architecture, similar to me above. I don't believe there was a solution for now.

@DotIN13
Copy link

DotIN13 commented Apr 2, 2021

Having the same problem using ruby-vips with Jekyll Picture Tag on an M1 Macbook.

@jcupitt
Copy link
Member

jcupitt commented Apr 2, 2021

Hi @DotIN13, you need to give a lot more information. What error did you get, how did you install everything, what versions are you running, where is your glib installed, which ruby are you using etc. etc.

Could it perhaps be a native vs. x86 problem? For example, if glib has been built for x86 and ruby is native it obviously won't work.

@kleisauke
Copy link
Member

I think PR ffi/ffi#882 might fix this. As a workaround, you could try to symlink the whole /opt/homebrew/lib directory to /opt/local/lib (untested).

@DotIN13
Copy link

DotIN13 commented Apr 3, 2021

Error

Dependency Error: Yikes! It looks like you don't have jekyll_picture_tag or one of its dependencies installed. In order to use Jekyll as currently configured, you'll need to install this gem. If you've run Jekyll with bundle exec, ensure that you have included the jekyll_picture_tag gem in your Gemfile as well. The full error message from Ruby is: 'Could not open library 'glib-2.0.0': dlopen(glib-2.0.0, 5): image not found. Could not open library 'libglib-2.0.0.dylib': dlopen(libglib-2.0.0.dylib, 5): image not found' If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/!
------------------------------------------------
Jekyll 4.2.0 Please append --trace to the serve command
for any additional information or backtrace.
------------------------------------------------

How did I install everything?

brew: official install script, arm64

glib, vips: via brew, arm64

ruby: via rbenv, arm64

Ruby Version

ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [arm64-darwin20]

glib

glib: stable 2.68.0 (bottled)
Core application library for C
https://developer.gnome.org/glib/
/opt/homebrew/Cellar/glib/2.68.0 (442 files, 22.0MB) *

vips info

vips: stable 8.10.6 (bottled)
Image processing library
https://github.com/libvips/libvips
/opt/homebrew/Cellar/vips/8.10.6 (167 files, 14.2MB) *

So I guess it's all native but something just went wrong.

@DotIN13
Copy link

DotIN13 commented Apr 3, 2021

I think PR ffi/ffi#882 might fix this. As a workaround, you could try to symlink the whole /opt/homebrew/lib directory to /opt/local/lib (untested).

After symlinking with the following command, it worked like butter, thanks a lot.

sudo ln -s /opt/homebrew/lib /opt/local/lib

@jcupitt
Copy link
Member

jcupitt commented Apr 4, 2021

Ah thanks for that Kleis, I hadn't realized homebrew had moved the lib area.

Related: https://github.com/ioquatix/ffi-module

A more modern interface to ruby-ffi which has much better library searching. It might be useful to experiment with something similar.

@rdetert
Copy link

rdetert commented May 12, 2021

@DotIN13 @kleisauke Yes, this works. M1 strikes again!

@bdhartz
Copy link
Author

bdhartz commented May 12, 2021

@rdetert @DotIN13 @kleisauke - thanks for your work on this! For whatever reason, I don't have a /opt/local directory, so sudo ln -s /opt/homebrew/lib /opt/local/lib fails with ln: /opt/local/lib: No such file or directory. My /opt/ only has homebrew in it, nothing else. Should I have a /opt/local and is there a way you know of that I can get this back to how it should be? Thanks a bunch!

@DotIN13
Copy link

DotIN13 commented May 12, 2021

@bdhartz You could try creating /opt/local with mkdir -p /opt/local/lib.

@greycampbell
Copy link

I think PR ffi/ffi#882 might fix this. As a workaround, you could try to symlink the whole /opt/homebrew/lib directory to /opt/local/lib (untested).

After symlinking with the following command, it worked like butter, thanks a lot.

sudo ln -s /opt/homebrew/lib /opt/local/lib

This was close for me, but I had to do sudo ln -s /opt/homebrew/lib /usr/local/lib to get it to work. I'd tried to install the older homebrew so this path already existed for me; you might have to manually create it

@mmhan
Copy link

mmhan commented Jun 4, 2021

I followed the instructions to create a symlink and I got the following error on my m1 machine.

❯ rails c
Running via Spring preloader in process 13791
Loading development environment (Rails 6.0.3.2)
2.6.5 :001 > require 'vips'
objc[13791]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called.
objc[13791]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.

I also get the same error if I used the ffi with ffi/ffi#882 fix implemented.

Is anyone else getting that?

@greycampbell
Copy link

I followed the instructions to create a symlink and I got the following error on my m1 machine.

❯ rails c
Running via Spring preloader in process 13791
Loading development environment (Rails 6.0.3.2)
2.6.5 :001 > require 'vips'
objc[13791]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called.
objc[13791]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.

I also get the same error if I used the ffi with ffi/ffi#882 fix implemented.

Is anyone else getting that?

@mmhan I might be wrong but try adding "export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES" to your .bashrc or .zshrc

@mmhan
Copy link

mmhan commented Jun 4, 2021

@greycampbell - Yep, it worked! Thanks!

@Adverbly
Copy link

I ran into this as well. Also on M1. Had to modify the symlimk comments from above because I couldn't directly link the entire directory. What I used:

 sudo ln -s /opt/homebrew/lib/libglib-2.0.0.dylib /usr/local/lib/
 sudo ln -s /opt/homebrew/lib/libvips.42.dylib /usr/local/lib/
 sudo ln -s /opt/homebrew/lib/libgobject-2.0.0.dylib /usr/local/lib/

@leandrocastro
Copy link

I managed to solve it like this:

sudo ln -s /opt/homebrew/lib /opt/local/lib

Then I removed all installed gems:

yes Y | gem uninstall -a -I

Then I installed the bundle

gem install bundler

Then I installed all the gems again:

bundle install

@donncha
Copy link

donncha commented Jul 22, 2022

$ bundle update ffi

might fix it. v1.15.0 doesn't look in /opt/homebrew/lib. v1.15.3+ does.

@galohernandez
Copy link

I did all the fixes but had no luck. Fixed using the command

brew install vips

Maybe this could help1

MarioCesarBais added a commit to MarioCesarBais/thetapundit that referenced this issue Jan 20, 2023
@stevecondylios
Copy link

@Adverbly's solution worked perfectly for me. I didn't quite understand what was going on, so I looked around a bit and learned:

  • Files in /opt/... are arm architecture, whereas files in /usr/local/lib are intel.
  • If ever unsure, you can find a dylib's architecture using the file command, example:
file /opt/homebrew/lib/libglib-2.0.0.dylib
# /opt/homebrew/lib/libglib-2.0.0.dylib: Mach-O 64-bit dynamically linked shared library arm64

super handy!

  • ln -s creates a symbolic link.
    • If the destination (second argument) already exists, it may not let you create the symbolic link, (which was the case for me). Since I already had libraries of the names of the symbolic links in /usr/local/lib, I moved them to the desktop; in hindsight, I could have simply deleted them, but I was being risk-averse.

Hope it's useful.

@mattlindsey
Copy link

I just had this issue on a new M2 mac and solved it by removing the old x86 homebrew:

curl -fsSL -o /tmp/uninstall.sh https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh
arch -x86_64 /bin/bash /tmp/uninstall.sh --path=/usr/local

@jdsampayo
Copy link

There has been an ongoing discussion in multiple PRs about how to fix the Homebrew path issue. One notable PR that was merged, offering a more general solution, can be found at ffi/ffi#968

While the fix has been merged, there hasn't been a new release yet. To address the glib problem, I used the master branch of ffi in my Bundler:

gem 'ffi', git: 'https://github.com/ffi/ffi.git', branch: 'master'

If you prefer a more stable commit instead of the latest master, you can specify that. With this solution, there's no need to create symlinks between the arm64 and the Rosetta 2 (x86_64) versions of Homebrew.

@guschiavon
Copy link

I did all the fixes but had no luck. Fixed using the command

brew install vips

Maybe this could help1

This has completely thrown my system configuration and now I'm not able to locally run any project that leverages the vips library...

@kleisauke
Copy link
Member

While the fix has been merged, there hasn't been a new release yet.

It appears that the Ruby-FFI gem has recently released v1.16.0, which should address this issue.

@hiveer
Copy link

hiveer commented Oct 26, 2023

In my case, I'm using Mac OS 14.0 with M2, what I did is just to:

  1. brew install glib
  2. brew install vips

@thomasbromehead
Copy link

v1.16.0

Still having the issue with ffi 1.16.3 and Ventura 13.5 on an M1 Macbook Air

@jcupitt
Copy link
Member

jcupitt commented Nov 3, 2023

Hi @thomasbromehead,

It was working fine on my M2 mac mini last time I tested it, I'll try again to verify some time this weekend.

I would doublecheck that you are using homebrew ruby and that you have no old x86 homebrew binaries on your system, in case you've not done that.

@jcupitt
Copy link
Member

jcupitt commented Nov 3, 2023

I tried just now on my M2 mac mini, and it all worked. Here's what I did:

  1. I use bash as my shell
  2. I uninstalled all of homebrew to make sure I had a clean slate, I emptied my .bash_profile
  3. Ran the usual /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" to install homebrew
  4. I added homebrew to my path in the usual way.

Here's my .bash_profile:

export CLICOLOR=1

eval "$(/opt/homebrew/bin/brew shellenv)"

I also ran eval "$(/opt/homebrew/bin/brew shellenv)" directly to make sure everything was set up.

  1. I ran brew install vips
  2. I used the apple ruby (2.6.0) for testing, but I'm sure you should use the homebrew one. I ran gem install ruby-vips --user-install to install everything to ~/.gem.

To verify it worked, I tried:

$ irb

WARNING: This version of ruby is included in macOS for compatibility with legacy software.
In future versions of macOS the ruby runtime will not be available by
default, and may require you to install an additional package.

irb(main):002:0> require "vips"
=> true
irb(main):003:0> Vips::Image.black(10,10)
=> #<Image 10x10 uchar, 1 bands, multiband>
irb(main):004:0> ^D

I have the various glib libraries in /opt/homebrew, and nothing in /usr/local:

$ ls /opt/homebrew/lib/libgob*
/opt/homebrew/lib/libgobject-2.0.0.dylib
/opt/homebrew/lib/libgobject-2.0.a
/opt/homebrew/lib/libgobject-2.0.dylib
$ ls /opt/homebrew/lib/libglib*
/opt/homebrew/lib/libglib-2.0.0.dylib /opt/homebrew/lib/libglib-2.0.dylib
/opt/homebrew/lib/libglib-2.0.a
$ ls /opt/homebrew/lib/libvip*
/opt/homebrew/lib/libvips-cpp.42.dylib /opt/homebrew/lib/libvips.42.dylib
/opt/homebrew/lib/libvips-cpp.dylib    /opt/homebrew/lib/libvips.dylib
$ ls /usr/local
$

@aristotekean
Copy link

I tried just now on my M2 mac mini, and it all worked. Here's what I did:

  1. I use bash as my shell
  2. I uninstalled all of homebrew to make sure I had a clean slate, I emptied my .bash_profile
  3. Ran the usual /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" to install homebrew
  4. I added homebrew to my path in the usual way.

Here's my .bash_profile:

export CLICOLOR=1

eval "$(/opt/homebrew/bin/brew shellenv)"

I also ran eval "$(/opt/homebrew/bin/brew shellenv)" directly to make sure everything was set up.

  1. I ran brew install vips
  2. I used the apple ruby (2.6.0) for testing, but I'm sure you should use the homebrew one. I ran gem install ruby-vips --user-install to install everything to ~/.gem.

To verify it worked, I tried:

$ irb

WARNING: This version of ruby is included in macOS for compatibility with legacy software.
In future versions of macOS the ruby runtime will not be available by
default, and may require you to install an additional package.

irb(main):002:0> require "vips"
=> true
irb(main):003:0> Vips::Image.black(10,10)
=> #<Image 10x10 uchar, 1 bands, multiband>
irb(main):004:0> ^D

I have the various glib libraries in /opt/homebrew, and nothing in /usr/local:

$ ls /opt/homebrew/lib/libgob*
/opt/homebrew/lib/libgobject-2.0.0.dylib
/opt/homebrew/lib/libgobject-2.0.a
/opt/homebrew/lib/libgobject-2.0.dylib
$ ls /opt/homebrew/lib/libglib*
/opt/homebrew/lib/libglib-2.0.0.dylib /opt/homebrew/lib/libglib-2.0.dylib
/opt/homebrew/lib/libglib-2.0.a
$ ls /opt/homebrew/lib/libvip*
/opt/homebrew/lib/libvips-cpp.42.dylib /opt/homebrew/lib/libvips.42.dylib
/opt/homebrew/lib/libvips-cpp.dylib    /opt/homebrew/lib/libvips.dylib
$ ls /usr/local
$

It worked for me.
Macbook M1

@ansonhoyt
Copy link

brew reinstall glib fixed it on my M1, so maybe some folks can avoid a bigger reinstall.

Details

My Homebrew packages have been installed to /opt/homebrew with arm64 brew for many months, and vips was working, but I noticed the .dylibs folks mentioned were missing until I reinstalled glib:

# glib is installed but missing dylibs:
$ brew info glib
==> glib: stable 2.80.0 (bottled)
Core application library for C
https://developer.gnome.org/glib/
/opt/homebrew/Cellar/glib/2.80.0_2 (524 files, 36MB)
  Poured from bottle using the formulae.brew.sh API on 2024-03-31 at 19:30:11
...
$ ls /opt/homebrew/lib/libgob*
ls: /opt/homebrew/lib/libgob*: No such file or directory

# Reinstalled and now dylibs are found:
$ brew reinstall glib
$ ls /opt/homebrew/lib/libgob*
/opt/homebrew/lib/libgobject-2.0.0.dylib /opt/homebrew/lib/libgobject-2.0.dylib
/opt/homebrew/lib/libgobject-2.0.a

# Now vips loads without errors again:
$ ruby -e 'require "vips"'

(While I still have a few things installed with a separate x86_64 homebrew install, neither glib nor vips were. That didn't seem to be an issue.)

@Yannmm
Copy link

Yannmm commented Apr 20, 2024

In my case, I'm using Mac OS 14.0 with M2, what I did is just to:

  1. brew install glib
  2. brew install vips

worked for me. I'm using rails 7.1.3 on mac M1 chip.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests