question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

MacOS w/ node-canvas, Library not loaded: /usr/local/opt/pixman/lib/libpixman-1.0.dylib

See original GitHub issue

electron-builder v 22.3.2

Uses node-canvas. Building for Windows and Linux appears to work properly, however with MacOS I get the following error when I try to run it on a fresh machine. Installing brew and installing the cairo build dependencies on the fresh machine allowed it to run.

Error: dlopen(/var/folders/mq/cwx7xp9d7qx68l0647xwybym0000gn/T/.com.camhart.netcountable.desktop.RA3whH, 1): Library not loaded: /usr/local/opt/pixman/lib/libpixman-1.0.dylib
  Referenced from: /var/folders/mq/cwx7xp9d7qx68l0647xwybym0000gn/T/.com.camhart.netcountable.desktop.RA3whH
  Reason: image not found
    at process.func (electron/js2c/asar.js:140:31)
    at process.func [as dlopen] (electron/js2c/asar.js:140:31)
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:1016:18)
    at Object.func (electron/js2c/asar.js:140:31)
    at Object.func [as .node] (electron/js2c/asar.js:149:18)
    at Module.load (internal/modules/cjs/loader.js:816:32)
    at Module._load (internal/modules/cjs/loader.js:728:14)
    at Module._load (electron/js2c/asar.js:717:26)
    at Function.Module._load (electron/js2c/asar.js:717:26)
    at Module.require (internal/modules/cjs/loader.js:853:19)

Issue Analytics

  • State:closed
  • Created 4 years ago
  • Reactions:2
  • Comments:11

github_iconTop GitHub Comments

1reaction
aWalruscommented, Oct 31, 2020

@nullxx thank you so much for your solution! It did fix my build issues on Windows, but not on MacOS. The compiled canvas.node still seemed to reference .dylib files in my /usr/ directory, and not the ones copied/packaged. (My debugging process involved a lot of otool -L canvas.node and install_name_tool -change if anyone’s interested)

My final approach:

  1. Copied the required .dylibs as described by you (to /node_modules/canvas/lib/dylib)
  2. Used your bindings.gyp file to run node-gyp rebuild inside node_modules/canvas (which calls node-gyp configure anyway)
  3. Set buildDependenciesFromSource, nodeGypRebuild, npmRebuild all to **false**, as they seem to rebuild the library unneccesarily, breaking the references again
  4. Ran npx electron-rebuild -f -w canvas, which I later added to the package.json
  5. Patched build/Release/canvas.node with macpack (possible alternative: macdylibbundler)
  6. Ran electron-builder --mac to get a .dmg that functions on a fresh machine without cairo, pango etc. installed.

Thanks again for your solution, I probably wouldn’t have figured it out alone!

1reaction
nullxxcommented, Oct 26, 2020

@aWalrus try this solution:

  • Get the prebuilt libraries and copy them to the following paths:
node_modules/canvas/lib/dylib/libcairo-gobject.2.dylib
node_modules/canvas/lib/dylib/libcairo.2.dylib
node_modules/canvas/lib/dylib/libcroco-0.6.3.dylib
node_modules/canvas/lib/dylib/libffi.7.dylib
node_modules/canvas/lib/dylib/libfontconfig.1.dylib
node_modules/canvas/lib/dylib/libfreetype.6.dylib
node_modules/canvas/lib/dylib/libfribidi.0.dylib
node_modules/canvas/lib/dylib/libgdk_pixbuf-2.0.0.dylib
node_modules/canvas/lib/dylib/libgif.7.dylib
node_modules/canvas/lib/dylib/libgif.dylib
node_modules/canvas/lib/dylib/libgio-2.0.0.dylib
node_modules/canvas/lib/dylib/libglib-2.0.0.dylib
node_modules/canvas/lib/dylib/libgmodule-2.0.0.dylib
node_modules/canvas/lib/dylib/libgobject-2.0.0.dylib
node_modules/canvas/lib/dylib/libgraphite2.3.2.1.dylib
node_modules/canvas/lib/dylib/libharfbuzz.0.dylib
node_modules/canvas/lib/dylib/libintl.8.dylib
node_modules/canvas/lib/dylib/libjpeg.8.dylib
node_modules/canvas/lib/dylib/libjpeg.9.dylib
node_modules/canvas/lib/dylib/libjpeg.dylib
node_modules/canvas/lib/dylib/libpango-1.0.0.dylib
node_modules/canvas/lib/dylib/libpangocairo-1.0.0.dylib
node_modules/canvas/lib/dylib/libpangoft2-1.0.0.dylib
node_modules/canvas/lib/dylib/libpcre.1.dylib
node_modules/canvas/lib/dylib/libpixman-1.0.dylib
node_modules/canvas/lib/dylib/libpng16.16.dylib
node_modules/canvas/lib/dylib/librsvg-2.2.dylib
  • Change your node_modules/canvas/binding.gyp:
{
    'conditions': [
        ['OS=="win"', {
            'variables': {
                'GTK_Root%': 'C:/GTK',  # Set the location of GTK all-in-one bundle
                'with_jpeg%': 'false',
                'with_gif%': 'false',
                'with_rsvg%': 'false',
                'variables': {  # Nest jpeg_root to evaluate it before with_jpeg
                    'jpeg_root%': '<!(node ./util/win_jpeg_lookup)'
                },
                'jpeg_root%': '<(jpeg_root)',  # Take value of nested variable
                'conditions': [
                    ['jpeg_root==""', {
                        'with_jpeg%': 'false'
                    }, {
                        'with_jpeg%': 'true'
                    }]
                ]
            }
        }, {  # 'OS!="win"'
            'variables': {
                'with_jpeg%': '<!(node ./util/has_lib.js jpeg)',
                'with_gif%': '<!(node ./util/has_lib.js gif)',
                'with_rsvg%': '<!(node ./util/has_lib.js rsvg)'
            }
        }]
    ],
    'targets': [
        {
            'target_name': 'canvas-postbuild',
            'dependencies': ['canvas'],
            'conditions': [
                ['OS=="win"', {
                    'copies': [{
                        'destination': '<(PRODUCT_DIR)',
                        'files': [
                            '<(GTK_Root)/bin/zlib1.dll',
                            '<(GTK_Root)/bin/libintl-8.dll',
                            '<(GTK_Root)/bin/libpng14-14.dll',
                            '<(GTK_Root)/bin/libpangocairo-1.0-0.dll',
                            '<(GTK_Root)/bin/libpango-1.0-0.dll',
                            '<(GTK_Root)/bin/libpangoft2-1.0-0.dll',
                            '<(GTK_Root)/bin/libpangowin32-1.0-0.dll',
                            '<(GTK_Root)/bin/libcairo-2.dll',
                            '<(GTK_Root)/bin/libfontconfig-1.dll',
                            '<(GTK_Root)/bin/libfreetype-6.dll',
                            '<(GTK_Root)/bin/libglib-2.0-0.dll',
                            '<(GTK_Root)/bin/libgobject-2.0-0.dll',
                            '<(GTK_Root)/bin/libgmodule-2.0-0.dll',
                            '<(GTK_Root)/bin/libgthread-2.0-0.dll',
                            '<(GTK_Root)/bin/libexpat-1.dll'
                        ]
                    }]
                }]
            ]
        },
        {
            'target_name': 'canvas',
            'include_dirs': ["<!(node -e \"require('nan')\")"],
            'sources': [
                'src/backend/Backend.cc',
                'src/backend/ImageBackend.cc',
                'src/backend/PdfBackend.cc',
                'src/backend/SvgBackend.cc',
                'src/bmp/BMPParser.cc',
                'src/Backends.cc',
                'src/Canvas.cc',
                'src/CanvasGradient.cc',
                'src/CanvasPattern.cc',
                'src/CanvasRenderingContext2d.cc',
                'src/closure.cc',
                'src/color.cc',
                'src/Image.cc',
                'src/ImageData.cc',
                'src/init.cc',
                'src/register_font.cc'
            ],
            'conditions': [
                ['OS=="win"', {
                    'libraries': [
                        '-l<(GTK_Root)/lib/cairo.lib',
                        '-l<(GTK_Root)/lib/libpng.lib',
                        '-l<(GTK_Root)/lib/pangocairo-1.0.lib',
                        '-l<(GTK_Root)/lib/pango-1.0.lib',
                        '-l<(GTK_Root)/lib/freetype.lib',
                        '-l<(GTK_Root)/lib/glib-2.0.lib',
                        '-l<(GTK_Root)/lib/gobject-2.0.lib'
                    ],
                    'include_dirs': [
                        '<(GTK_Root)/include',
                        '<(GTK_Root)/include/cairo',
                        '<(GTK_Root)/include/pango-1.0',
                        '<(GTK_Root)/include/glib-2.0',
                        '<(GTK_Root)/include/freetype2',
                        '<(GTK_Root)/lib/glib-2.0/include'
                    ],
                    'defines': [
                        '_USE_MATH_DEFINES'  # for M_PI
                    ],
                    'configurations': {
                        'Debug': {
                            'msvs_settings': {
                                'VCCLCompilerTool': {
                                    'WarningLevel': 4,
                                    'ExceptionHandling': 1,
                                    'DisableSpecificWarnings': [
                                        4100, 4611
                                    ]
                                }
                            }
                        },
                        'Release': {
                            'msvs_settings': {
                                'VCCLCompilerTool': {
                                    'WarningLevel': 4,
                                    'ExceptionHandling': 1,
                                    'DisableSpecificWarnings': [
                                        4100, 4611
                                    ]
                                }
                            }
                        }
                    }
                }, {  # 'OS!="win"'
                    'include_dirs': [
                        '<!@(pkg-config cairo --cflags-only-I | sed s/-I//g)',
                        '<!@(pkg-config libpng --cflags-only-I | sed s/-I//g)',
                        '<!@(pkg-config pangocairo --cflags-only-I | sed s/-I//g)',
                        '<!@(pkg-config freetype2 --cflags-only-I | sed s/-I//g)'
                    ],
                    'cflags!': ['-fno-exceptions'],
                    'cflags_cc!': ['-fno-exceptions']
                }],
                ['OS=="linux"', {
                    'libraries': [
                        '<!@(pkg-config pixman-1 --libs)',
                        '<!@(pkg-config cairo --libs)',
                        '<!@(pkg-config libpng --libs)',
                        '<!@(pkg-config pangocairo --libs)',
                        '<!@(pkg-config freetype2 --libs)'
                    ],
                }],
                ['OS=="mac"', {
                    'libraries': [
                        '<@(module_root_dir)/lib/dylib/libpixman-1.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libcairo.2.dylib',
                        '<@(module_root_dir)/lib/dylib/libpng16.16.dylib',
                        '<@(module_root_dir)/lib/dylib/libpangocairo-1.0.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libgobject-2.0.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libintl.8.dylib',
                        '<@(module_root_dir)/lib/dylib/libharfbuzz.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libfreetype.6.dylib',
                        '<@(module_root_dir)/lib/dylib/librsvg-2.2.dylib',
                        '<@(module_root_dir)/lib/dylib/libcairo-gobject.2.dylib',
                        '<@(module_root_dir)/lib/dylib/libcroco-0.6.3.dylib',
                        '<@(module_root_dir)/lib/dylib/libffi.7.dylib',
                        '<@(module_root_dir)/lib/dylib/libfontconfig.1.dylib',
                        '<@(module_root_dir)/lib/dylib/libfribidi.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libgdk_pixbuf-2.0.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libgif.7.dylib',
                        '<@(module_root_dir)/lib/dylib/libgif.dylib',
                        '<@(module_root_dir)/lib/dylib/libgio-2.0.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libglib-2.0.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libgmodule-2.0.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libgraphite2.3.2.1.dylib',
                        '<@(module_root_dir)/lib/dylib/libjpeg.9.dylib',
                        '<@(module_root_dir)/lib/dylib/libpango-1.0.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libpangoft2-1.0.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libpcre.1.dylib',
                        '<@(module_root_dir)/lib/dylib/libpixman-1.0.dylib',
                        '<@(module_root_dir)/lib/dylib/libpng16.16.dylib',
                        '<@(module_root_dir)/lib/dylib/librsvg-2.2.dylib',
                    ],
                    "copies": [
                        {
                            "destination": "build/Release/",
                            "files": [
                                '<@(module_root_dir)/lib/dylib/libpixman-1.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libcairo.2.dylib',
                                '<@(module_root_dir)/lib/dylib/libpng16.16.dylib',
                                '<@(module_root_dir)/lib/dylib/libpangocairo-1.0.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libgobject-2.0.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libintl.8.dylib',
                                '<@(module_root_dir)/lib/dylib/libharfbuzz.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libfreetype.6.dylib',
                                '<@(module_root_dir)/lib/dylib/librsvg-2.2.dylib',
                                '<@(module_root_dir)/lib/dylib/libcairo-gobject.2.dylib',
                                '<@(module_root_dir)/lib/dylib/libcroco-0.6.3.dylib',
                                '<@(module_root_dir)/lib/dylib/libffi.7.dylib',
                                '<@(module_root_dir)/lib/dylib/libfontconfig.1.dylib',
                                '<@(module_root_dir)/lib/dylib/libfribidi.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libgdk_pixbuf-2.0.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libgif.7.dylib',
                                '<@(module_root_dir)/lib/dylib/libgif.dylib',
                                '<@(module_root_dir)/lib/dylib/libgio-2.0.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libglib-2.0.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libgmodule-2.0.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libgraphite2.3.2.1.dylib',
                                '<@(module_root_dir)/lib/dylib/libjpeg.9.dylib',
                                '<@(module_root_dir)/lib/dylib/libpango-1.0.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libpangoft2-1.0.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libpcre.1.dylib',
                                '<@(module_root_dir)/lib/dylib/libpixman-1.0.dylib',
                                '<@(module_root_dir)/lib/dylib/libpng16.16.dylib',
                                '<@(module_root_dir)/lib/dylib/librsvg-2.2.dylib',
                            ]
                        },
                    ],
                    'xcode_settings': {
                        'GCC_ENABLE_CPP_EXCEPTIONS': 'YES'
                    }
                }],
                ['with_jpeg=="true"', {
                    'defines': [
                        'HAVE_JPEG'
                    ],
                    'conditions': [
                        ['OS=="win"', {
                            'copies': [{
                                'destination': '<(PRODUCT_DIR)',
                                'files': [
                                    '<(jpeg_root)/bin/jpeg62.dll',
                                ]
                            }],
                            'include_dirs': [
                                '<(jpeg_root)/include'
                            ],
                            'libraries': [
                                '-l<(jpeg_root)/lib/jpeg.lib',
                            ]
                        }],
                        ['OS=="linux"', {
                            'libraries': [
                                '-ljpeg'
                            ]
                        }]
                    ]
                }],
                ['with_gif=="true"', {
                    'defines': [
                        'HAVE_GIF'
                    ],
                    'conditions': [
                        ['OS=="win"', {
                            'libraries': [
                                '-l<(GTK_Root)/lib/gif.lib'
                            ]
                        }, {
                            'libraries': [
                                '-lgif'
                            ]
                        }]
                    ]
                }],
                ['with_rsvg=="true"', {
                    'defines': [
                        'HAVE_RSVG'
                    ],
                    'conditions': [
                        ['OS=="win"', {
                            'copies': [{
                                'destination': '<(PRODUCT_DIR)',
                                'files': [
                                    '<(GTK_Root)/bin/librsvg-2-2.dll',
                                    '<(GTK_Root)/bin/libgdk_pixbuf-2.0-0.dll',
                                    '<(GTK_Root)/bin/libgio-2.0-0.dll',
                                    '<(GTK_Root)/bin/libcroco-0.6-3.dll',
                                    '<(GTK_Root)/bin/libgsf-1-114.dll',
                                    '<(GTK_Root)/bin/libxml2-2.dll'
                                ]
                            }],
                            'libraries': [
                                '-l<(GTK_Root)/lib/librsvg-2-2.lib'
                            ]
                        }, {
                            'include_dirs': [
                                '<!@(pkg-config librsvg-2.0 --cflags-only-I | sed s/-I//g)'
                            ],
                        }]
                    ]
                }]
            ]
        }
    ]
}
  • Run node-gyp configure inside node_modules/canvas
  • Run node-gyp rebuild inside node_modules/canvas
  • Add this config to your package.json
"build": "npx electron-rebuild -m ./node_modules/canvas"
  • Is better to remove the dependency from node_modules and move it to somewhere more stable folder.
Read more comments on GitHub >

github_iconTop Results From Across the Web

xcode14:Library not loaded: /usr/l… | Apple Developer Forums
I use xcode 14 and run to iphone 11.2 , and my app crashes when runs. The crash log is " dyld: Library...
Read more >
macos - dyld: Library not loaded ... Reason: Image not found
I think the problem has something to do with the executable only looking in the directory it is in as when I paste...
Read more >
How to Fix 'Dyld: Library not Loaded' Error on MacOS - Appuals
It is possible to counter the problem by creating a Symbolic Link in the directory where the computer is checking for the “.dylib”...
Read more >
Library not loaded: @rpath/libfreeimage-3.17.0.dylib
In the long run I guess we need to pin freeimage and update every freeimage dependent package. Or find a solution for osx,...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found