微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NodeJS插件构建错误C3861:'_alloca':未找到标识符

如何解决NodeJS插件构建错误C3861:'_alloca':未找到标识符

尝试使用 boost 构建一个简单的节点插件时,编译器失败并显示错误

absolute\path\to\boost_1_76_0\boost_1_76_0\boost\asio\detail\impl\socket_ops.ipp(2481,34): error C3861: '_alloca': identifier not found [absolute\path\to\project\src\nativeSimpl
e\build\nativesimple-native.vcxproj]
absolute\path\to\boost_1_76_0\boost_1_76_0\boost\asio\detail\impl\socket_ops.ipp(2692,32): error C3861: '_alloca': identifier not found [absolute\path\to\project\src\nativeSimpl 
e\build\nativesimple-native.vcxproj]

我已经使用 Yeoman Generator 设置了项目:https://www.npmjs.com/package/generator-napi-module#installation。构建适用于生成代码。我用我的函数替换生成代码

代码

nativesimple.cc

#include <iostream>
#include <napi.h>
#include <boost/array.hpp>
#include <boost/asio.hpp>

using namespace Napi;
using boost::asio::ip::udp;

Napi::String Connect(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();

    boost::asio::io_context io_context;

    udp::resolver resolver(io_context);
    udp::endpoint sender_endpoint =
        *resolver.resolve(udp::v4(),"127.0.0.1","20777").begin();

    udp::socket socket(io_context);
    socket.open(udp::v4());
    socket.bind(sender_endpoint);

    std::array<float,66> recv_buf;
    size_t len = socket.receive_from(
    boost::asio::buffer(recv_buf),sender_endpoint);

    std::cout << std::to_string(recv_buf[29]).c_str() << std::to_string(recv_buf[31]).c_str() << std::endl;

    return Napi::String::New(env,"DONE");
}

Napi::Object Init(Napi::Env env,Napi::Object exports) {
  exports.Set(Napi::String::New(env,"udpConnect"),Napi::Function::New(env,Connect));
  return exports;
}



NODE_API_MODULE(addon,Init)

binding.gyp

{
  'targets': [
    {
      'target_name': 'nativesimple-native','sources': [ 'src/nativesimple.cc' ],'include_dirs': [
        "<!@(node -p \"require('node-addon-api').include\")","absolute\\path\\to\\boost_1_76_0\\boost_1_76_0"
      ],'dependencies': ["<!(node -p \"require('node-addon-api').gyp\")"],'cflags!': [ '-fno-exceptions' ],'cflags_cc!': [ '-fno-exceptions' ],'xcode_settings': {
        'GCC_ENABLE_CPP_EXCEPTIONS': 'YES','CLANG_CXX_LIBRARY': 'libc++','MACOSX_DEPLOYMENT_TARGET': '10.7'
      },'msvs_settings': {
        'VcclCompilerTool': { 'ExceptionHandling': 1 },}
    }
  ]
}

构建环境:

  • 操作系统:Windows 10
  • Visual Studio:2019 年

我尝试在 Visual Studio 2019 上构建与 C++ 项目相同的代码,并且成功构建。我应该如何解决这个问题?我认为应该是 node-gyp 的配置问题。

解决方法

boost\asio\detail\impl\socket_ops.ipp 不包含 <malloc.h>,它是 _alloca 函数所需的标头。

您可以通过在包含 boost 标头之前在代码中包含 <malloc.h> 来解决此问题。

您应该使用 boost asio 提出错误,并提供一个完整示例,说明如何重现问题以正确修复此问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。