- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个 node.js 附加组件,它是一个简单的包装器,用于从 Boost 库项目访问 perl 正则表达式。
我运行的是 OSX 10.9.2,而且我也不是 C++ 开发人员,所以对工具不熟悉。
我的项目如下所示
boost.cc
#include <node.h>
#include <v8.h>
#include <boost/regex.hpp>
using namespace v8;
Handle<Value> Match(const Arguments& args) {
HandleScope scope;
if (args.Length() < 2) {
ThrowException(Exception::TypeError(String::New("Wrong number of arguments")));
return scope.Close(Undefined());
}
if (!args[0]->IsString())
{
ThrowException(Exception::TypeError(String::New("Regex agrument 1 must be a string")));
return scope.Close(Undefined());
}
if (!args[1]->IsString())
{
ThrowException(Exception::TypeError(String::New("Target agrument 2 must be a string")));
return scope.Close(Undefined());
}
v8::String::Utf8Value param0(args[0]->ToString());
v8::String::Utf8Value param1(args[1]->ToString());
std::string sre = std::string(*param0);
std::string s = std::string(*param1);
try
{
boost::cmatch matches;
boost::regex re(sre, boost::regex::icase);
if (boost::regex_match(s.c_str(), matches, re))
{
return scope.Close(Boolean::New(true));
}
else
{
return scope.Close(Boolean::New(false));
}
}
catch (boost::regex_error& e)
{
ThrowException(Exception::TypeError(String::New("Regex is not a valid regular expression")));
return scope.Close(Undefined());
}
return scope.Close(Boolean::New(false));
}
void init(Handle<Object> exports) {
exports->Set(String::NewSymbol("match"),
FunctionTemplate::New(Match)->GetFunction());
}
NODE_MODULE(boost, init)
绑定(bind).gyp
{
"targets": [
{
"target_name": "boost",
"sources": [ "boost.cc" ],
"include_dirs": [
"/usr/local/include/boost",
],
"libraries": [
"/usr/local/lib/libboost_regex.dylib"
]
}
]
}
app.coffee
addon = require('../addons/boost/build/Release/boost')
console.log(addon.match("(?<!street)name", "StreetName"))
运行 node-gyp rebuild --verbose 可以成功构建附加组件。虽然运行应用程序时我收到以下错误:
dyld: lazy symbol binding failed: Symbol not found: __ZN5boost9re_detail12perl_matcherIPKcSaINS_9sub_matchIS3_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE14construct_initERKNS_11basic_regexIcSA_EENS_15regex_constants12_match_flagsE
Referenced from: <projects dir>/addons/boost/build/Release/boost.node
Expected in: dynamic lookup
dyld: Symbol not found: __ZN5boost9re_detail12perl_matcherIPKcSaINS_9sub_matchIS3_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE14construct_initERKNS_11basic_regexIcSA_EENS_15regex_constants12_match_flagsE
Referenced from: <projects dir>/addons/boost/build/Release/boost.node
Expected in: dynamic lookup
我已经使用 binding.gyp 和 otool 玩了几个小时,但我显然无法理解这里。
输出上的 otool 给我以下信息:
otool -L build/Release/boost.node
build/Release/boost.node:
/usr/local/lib/libboost_regex.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 60.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 2577.0.0)
我用 brew 安装了 boost 库(brew install --without-python boost),所有的动态库似乎都在那里。
我猜我的问题与这个类似:node-gyp on OSX 10.7.5 -- dyld: lazy symbol binding failed: Symbol not found - 但我没能解决这个问题。
我可以在没有依赖项的情况下运行一个基本的附加组件,看起来我无法使用 node-gyp 等正确链接 Boost 库。
如有任何帮助,我们将不胜感激!
最佳答案
答案是使用 C++11 编译 Node 插件。只需对 binding.gyp 进行一些调整即可。
绑定(bind).gyp
{
"targets": [
{
"target_name": "boost",
"sources": [ "boost.cc" ],
"include_dirs": [
"/usr/local/include/boost",
],
"libraries": [
"/usr/local/lib/libboost_regex.dylib"
],
"cflags_cc!": [ "-fno-rtti", "-fno-exceptions" ],
"cflags!": [ "-fno-exceptions" ],
"conditions": [
[ 'OS=="mac"', {
"xcode_settings": {
'OTHER_CPLUSPLUSFLAGS' : ['-std=c++11','-stdlib=libc++', '-v'],
'OTHER_LDFLAGS': ['-stdlib=libc++'],
'MACOSX_DEPLOYMENT_TARGET': '10.7',
'GCC_ENABLE_CPP_EXCEPTIONS': 'YES'
}
}]
]
}
]
}
关于c++ - 将 Node.js 模块中的 Boost 与 node-gyp 链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25679171/
我对 gyp 完全陌生,所以请原谅我对这个主题的任何无知——我正在尝试将一个使用 gyp 的项目合并到由 make 生成的更大环境中。有问题的 .gyp 文件有一个用于 C 文件的 -L 选项,它指向
我是第一次使用gyp,我已经阅读了它的在线帮助。我已经在命令行上的导出变量中使用 CC 选项设置了编译器(在 Windows 中使用 cygwin)。因此,所有文件都可以正确编译。现在,我想使用不同的
当node-gyp本身安装在/usr/bin/node-gyp中时,为什么它在绝对路径中寻找node-gyp.js?如果我这样做 find /usr -name node-gyp.js 结果是 /us
是否可以定义一个 GYP 变量,其值取决于构建配置的选择? 最佳答案 只需使用变量 $(BUILDTYPE)或 $(ConfigurationName) . 关于node-gyp - 基于构建配置的
在 Windows 10 v1903 上运行 npm 6.11.3、node-gyp 5.0.3、VS2019,出现此错误: 找不到模块 %AppData%\npm\node_modules\node
我在写 binding.gyp我的新 node.js 模块的文件。我的所有源文件都在 src/ 下子目录。我想在构建模块时使用所有这些。我不想每次添加新的 cpp 文件时都修改 binding.gyp
我希望看到在构建节点绑定(bind)时使用编译器和链接器标志。我怎样才能让node-gyp build在详细模式下运行来实现这一点。 (类似于 cmake 的 make VERBOSE=1) 最佳答案
node-gyp --help说: Usage: node-gyp [options] where is one of: - build - Invokes `make` and builds
我正在开发一个大node.js项目还包括几个 native 库。 为了在 JavaScript 中使用这些库,我使用 node-gyp 将它们编译为 Node 插件 (.node)。 。 我想运行no
我正在使用 node-gyp,我想在我的 binding.gyp 中使用环境变量的值文件。 这是困难的方式(列表上下文): '
我想用/MD 标志(多线程 DLL)编译一个 node.js 模块。 在 binding.gyp 的 cflags 选项中包含“/MD”不起作用。 最佳答案 在玩了 binding.gyp 之后 -
我正在尝试启动有关 Node C/C++ 附加组件的内容。 node-gyp 命令出错 我已经安装了vs2019,我的命令是 node-gyp configure --msvs_version=201
我整天都在做这件事,并尝试了很多不同的事情: 卸载 Node 并安装最新版本 使用 --msvs_version= 标志设置为 2010, 2011, 2012, 2013, 2015 删除 .nod
我正在尝试为 Node js 构建 hello world C++ 插件。 Node.js 和 Node-gyp 似乎都已成功安装到 Redhat Linux 中。但是,当我运行“node-gyp c
我在 ubuntu 14.04 和 node 8.0.0 下使用 NPM。 我已将我的 npm 从 5.2.0 升级到 5.6.0 但是在那之后所有的 npm 命令都失败了,说明有问题: node-g
我在 CentOS 6.8 上进行 node-gyp 重建时遇到错误: File "/usr/local/lib/node_modules/node-gyp/gyp/pylib/gyp/input.p
我正在为 nodejs 编写一个 C 插件,我可以毫无问题地使用 node-waf 编译和创建我的模块。但是我需要使用 node-gyp,当我尝试使用 node-gyp build 构建模块时,出现以
我有一个简单的 binding.gyp 文件来构建我的 node.js 扩展。我想改变库“mylib”的链接方法,静态链接而不是使用共享库。 { "targets": [ {
我正在尝试使用 npm 安装我的依赖项,但是当安装 firebase 时安装失败。我尝试使用 npm i firebase 单独安装 firebase但它不起作用。我删除了 node_modules
我正在创建 Angular 项目并使用 Express.js 作为后端,使用 SQLite3 作为数据库。当我通过命令 npm install sqlite3 安装 sqlite3 时,我在控制台中收
我是一名优秀的程序员,十分优秀!