将Node.js模块中的Boost与Node-gip链接
Linking Boost within Node.js Module with node-gyp
我正在尝试创建一个node.js插件,它是一个简单的包装器,用于访问Boost库项目中的perl正则表达式。
我运行的是OSX10.9.2,我也不是一个c++开发人员,所以这个工具并不熟悉。
我的项目如下
增压.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)
绑定.gyp
{
"targets": [
{
"target_name": "boost",
"sources": [ "boost.cc" ],
"include_dirs": [
"/usr/local/include/boost",
],
"libraries": [
"/usr/local/lib/libboost_regex.dylib"
]
}
]
}
应用程序咖啡
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
我已经玩了几个小时的绑定、吉普赛和奥托尔,但我显然在这里力不从心。
输出上的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安装——没有python boost),所有的动态库似乎都在那里。
我想我的问题与此类似:OSX 10.7.5上的node-gyp——dyld:懒惰符号绑定失败:找不到符号——但我在修复方面运气不佳。
我可以在没有依赖关系的情况下运行一个基本的插件,只是看起来我无法使用node-gyp等正确链接Boost库。
任何帮助都将不胜感激!
答案是使用c++11编译节点插件。只需要对binding.gyp进行几次调整。
绑定.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'
}
}]
]
}
]
}
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- node-gyp 在 macOS 上未正确链接库
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 在node-gip binding.gyp文件中,如何根据系统结构(32位、64位)包含不同的库文件
- 如何在Windows上使用带有node-gip的静态库
- node-gip解析windows构建上的外部库符号
- 将Node.js模块中的Boost与Node-gip链接