如何解决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 举报,一经查实,本站将立刻删除。