NodeJS Addon 构建错误 C3861:'_alloca':找不到标识符
NodeJS Addon build error C3861: '_alloca': identifier not found
尝试使用 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 },
}
}
]
}
构建环境:
- OS: Windows 10
- Visual Studio: 2019
我尝试在 Visual Studio 2019 上构建与 C++ 项目相同的代码,并且构建成功。我应该如何解决这个问题?我认为这应该是 node-gyp
.
的配置问题
boost\asio\detail\impl\socket_ops.ipp
doesn't include <malloc.h>
which is the required header for the _alloca
函数。
您可以通过在代码中包含 <malloc.h>
,然后再包含提升 headers.
来解决此问题
您应该使用 boost asio 提出一个错误,并提供一个完整的示例来说明如何重现该问题以正确解决此问题。
尝试使用 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 },
}
}
]
}
构建环境:
- OS: Windows 10
- Visual Studio: 2019
我尝试在 Visual Studio 2019 上构建与 C++ 项目相同的代码,并且构建成功。我应该如何解决这个问题?我认为这应该是 node-gyp
.
boost\asio\detail\impl\socket_ops.ipp
doesn't include <malloc.h>
which is the required header for the _alloca
函数。
您可以通过在代码中包含 <malloc.h>
,然后再包含提升 headers.
您应该使用 boost asio 提出一个错误,并提供一个完整的示例来说明如何重现该问题以正确解决此问题。