首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何告诉原生node.js扩展在哪里可以找到(正确的) libstdc++?

如何告诉原生node.js扩展在哪里可以找到(正确的) libstdc++?
EN

Stack Overflow用户
提问于 2016-05-23 21:29:58
回答 1查看 840关注 0票数 1

我正在从npm安装scrypt (https://www.npmjs.com/package/scrypt)。安装涉及构建原生node.js扩展的node-gyp构建步骤。然后,当我启动我的应用程序时,它失败了,并显示以下错误:

代码语言:javascript
复制
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)

这并不令人惊讶,因为

代码语言:javascript
复制
[xxxx@xxxx nodeapp]$ strings /package/host/localhost/gcc-4/lib64/libstdc++.so.6 | grep "GLIBCXX_3\.4\.21"
[xxxx@xxxx nodeapp]$

代码语言:javascript
复制
[xxxx@xxxx nodeapp]$ strings /package/host/localhost/gcc-5/lib64/libstdc++.so.6 | grep "GLIBCXX_3\.4\.21"
GLIBCXX_3.4.21
[xxxx@xxxx nodeapp]$

我有过

代码语言:javascript
复制
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上的那个?(为什么它会弄错呢?)

编辑:

这是一台CentOS机器。我正在使用node.js版本6.1.0,npm版本3.8.6,并且我正在尝试安装scrypt版本6.0.3,这是撰写本文时的最新版本。

编辑2:

我尝试通过编辑node_modules/scrypt/binding.gyp来静态链接库,添加

代码语言:javascript
复制
'libraries': ['/package/host/localhost/gcc-5/lib64/libstdc++.so.6'],

添加到四个指定目标中的每一个,然后运行node-gyp rebuild

我还尝试将其更改为

代码语言:javascript
复制
'libraries': ['-L/package/host/localhost/gcc-5/lib64', '-lstdc++'],

,这似乎在语法上也是有效的-但它仍然试图在运行时从错误的路径加载库。

EN

回答 1

Stack Overflow用户

发布于 2016-08-02 08:18:17

我遇到了类似的问题,并通过使用LD_PRELOAD动态加载libstdc++.so.6的技巧解决了这个问题:

代码语言:javascript
复制
LD_PRELOAD='/path/to/lib/libstdc++.so.6' /usr/bin/nodejs app.js
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37392348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档