2016-05-23 4 views
1

Я устанавливаю scrypt (https://www.npmjs.com/package/scrypt) от npm. Установка включает этап сборки node-gyp, который создает собственное расширение node.js. Когда я затем запустить мое приложение, она не со следующей ошибкой:Как указать собственное расширение node.js, где можно найти (справа) libstdC++?

node index.js 
module.js:568 
    return process.dlopen(module, path._makeLong(filename)); 
       ^

Error: /package/host/localhost/gcc-4/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/xxxx/xxxx/node_modules/scrypt/build/Release/scrypt.node) 
    at Error (native) 
    at Object.Module._extensions..node (module.js:568:18) 
    at Module.load (module.js:456:32) 
    at tryModuleLoad (module.js:415:12) 
    at Function.Module._load (module.js:407:3) 
    at Module.require (module.js:466:17) 
    at require (internal/module.js:20:19) 
    at Object.<anonymous> (/home/xxxx/xxxx/node_modules/scrypt/index.js:3:20) 
    at Module._compile (module.js:541:32) 
    at Object.Module._extensions..js (module.js:550:10) 
    at Module.load (module.js:456:32) 
    at tryModuleLoad (module.js:415:12) 
    at Function.Module._load (module.js:407:3) 
    at Module.require (module.js:466:17) 
    at require (internal/module.js:20:19) 
    at Object.<anonymous> (/home/xxxx/xxxx/node_modules/unfun-cms/lib/utils/password.js:3:16) 

что не так удивительно, потому что

[[email protected] nodeapp]$ strings /package/host/localhost/gcc-4/lib64/libstdc++.so.6 | grep "GLIBCXX_3\.4\.21" 
[[email protected] nodeapp]$ 

в то время как

[[email protected] nodeapp]$ strings /package/host/localhost/gcc-5/lib64/libstdc++.so.6 | grep "GLIBCXX_3\.4\.21" 
GLIBCXX_3.4.21 
[[email protected] nodeapp]$ 

У меня есть

export PATH=/package/host/localhost/gcc-5/bin:$PATH 
export LD_LIBRARY_PATH=/package/host/localhost/gcc-5/lib64:$LD_LIBRARY_PATH 

в моем .bashrc и gcc --version показаны 5.2.0 правильно, поэтому я предполагаю, что эти настройки в порядке.

Итак, вопрос в том, как сообщить scrypt путь к правильному libstdc++.so.6, а именно тот, который находится на /package/host/localhost/gcc-5/lib64/libstdc++.so.6? (И почему даже это неправильно?)

EDIT:

Это машина CentOS. Я использую версию node.js 6.1.0, версию npm 3.8.6, и я пытаюсь установить версию scrypt6.0.3, которая является последней версией на момент написания этой статьи.

EDIT 2:

Я пытался статически связать библиотеку путем редактирования node_modules/scrypt/binding.gyp, добавив

'libraries': ['/package/host/localhost/gcc-5/lib64/libstdc++.so.6'], 

к каждому из четырех указанных целей, а затем запустить node-gyp rebuild.

Я также попытался изменить это

'libraries': ['-L/package/host/localhost/gcc-5/lib64', '-lstdc++'], 

, которая, как представляется синтаксический правильными, слишком, но все же, он пытается загрузить библиотеку из ложного пути во время выполнения.

ответ

1

Я stubled с подобной проблемой и был решить ее с трюком использует динамическую нагрузку libstdC++ so.6 через LD_PRELOAD:.

LD_PRELOAD='/path/to/lib/libstdc++.so.6' /usr/bin/nodejs app.js