gpt4 book ai didi

c++ - 将 Node.js 模块中的 Boost 与 node-gyp 链接起来

转载 作者:太空宇宙 更新时间:2023-11-03 10:44:21 24 4
gpt4 key购买 nike

我正在尝试创建一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com