node-gyp项目命名BUG
当我们编写node原生模块的时候,免不了对node-gyp项目进行命名,在node-gyp进行build的时候,会跟binding.gyp配置文件中的target_name生成对应的原生模块。但是,如果target_name填写不规范,会触发编译问题。
问题与解决
本人发现,当target_name使用了短中线的时候("-"),会导致编译过程中触发编译问题:
error C2143: 语法错误: 缺少“;”(在“-”的前面)
使用下划线命名以及各种驼峰命名不会出现此问题。出现问题的点为文件最后使用宏的时候:
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
解决方案,target_name名称不使用中横线:
target_name: "the-demo" => target_name: "theDemo"
或
target_name: "the-demo" => target_name: "the_demo"
问题分析
接下来的问题分析,需要一定的C/C++知识。
编写样例
这里不再赘述样例,直接使用这篇文章建立一个demo:使用node-gyp编写简单的node原生模块 - 知乎 (zhihu.com),或是使用node-gyp编写简单的node原生模块 - w4ngzhen - 博客园 (cnblogs.com)。
Demo编写完成后,我们修改其中的target_name,使其带有中横线("-"):
{
"targets": [
{
"target_name": "hello-world",
"sources": [ "hello_world.cc" ]
}
]
}
修改为该target_name后,我们进行node-gyp configure && node-gyp build,会发现编译器报错:

使用IDE分析
我们曾经讲过,node-gyp实际上只是构建工具,他会根据各个操作平台,生成对应平台的项目。在Windows上,它最终会帮你生成一个解决方案。查看项目目录下,我们就能看到一个build文件夹,这个文件夹下面会有解决方案:

我们使用VS打开,开始进行分析:

通过IDE的智能提示,我们看到在下面的宏使用报错了:

通常,对于宏报错,我们需要的第一步是进行宏展开,查看到底是什么导致了编译错误的。在VS中,我们进行进行如下的配置,让编译器首先生成宏展开的源码:

然后,我们重新进行编译,可以看到在对应的生成目录下,产生了一个.i后缀的文件。

这个宏展开后的源码文件,可以更见方便的便于我们分析。我们直接定位到这个文件的最下方,可以看到我们已经经过宏展开的代码:

我们67404这行宏展开的代码拷贝到VS对应宏使用的地方,通过IDE来更加智能的检查这段有何问题:

因为改行很长,这里我进行一下格式化代码的操作:

可以看到,宏展开里面模块名为"hello-world",在上图指出的部分,被分割为了"hello - world",而分割开来后,导致了语法错误。如果target_name使用的"hello_world",则不会有这个问题:

实际上被"-"分割,是因为在宏展开的时候,作为了函数名的一部分,而函数名标识符是不能有"-"的。这里举例:
#define NAME hello-world
#define TEST_MACRO(fn) static void fn(void);
TEST_MACRO(NAME) // 报错,因为最终展开后:static void hello-world(void);
int main()
{
return 0;
}
C语言规定,标识符只能由字母(A~Z, az)、数字(09)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。
所以这就是为什么target_name使用有中横线的名称会报错了。
node-gyp项目命名BUG的更多相关文章
- Node.js项目APM监控之New Relic
现在上一个项目,如果没有APM监控服务或应用的运行性能参数,等于是一架没有盲降系统的飞机正在盲降,结果会很悲催.出现了访问失效等问题时,都很难判定是性能瓶颈还是一个藏的深的bug,汇报的时候一顿眼晕, ...
- 如何线上部署node.js项目
来源:http://blog.csdn.net/chenlinIT/article/details/73343793 前言 最近工作不是很忙,在空闲时间学习用node+express搭建自己的个人博客 ...
- 服务器小白的我,是如何将 node+mongodb 项目部署在服务器上并进行性能优化的
前言 本文讲解的是:做为前端开发人员,对服务器的了解还是小白的我,是如何一步步将 node+mongodb 项目部署在阿里云 centos 7.3 的服务器上,并进行性能优化,达到页面 1 秒内看到 ...
- 使用node初始化项目
初始化项目 在建项目的时候经常会建很多文件夹和文件,今天使用node初始化项目自动生成这些内容. 执行步骤 执行命令 node init 初始化项目生成package.json 设置配置文件 var ...
- [Node.js] Node.js项目的持续集成
原文地址:http://www.moye.me/2016/03/03/nodejs_ci_by_jenkins 引子 持续集成 (Continuous Integration,简称CI)是一种软件工程 ...
- WebStorm中Node.js项目配置教程(1)——创建项目
Node.js绝对是一个web开发的热点话题,作为web神器的WebStorm也是开发Node.js的佼佼者. 接下来就Node.js项目在WebStorm的配置操作就行详细的讲解,首先是创建项目.两 ...
- Node.js项目拆包工程化
背景 在我们开发的过程中,经常会遇到这样的问题,开发完了一些代码或者一个接口,别的小伙伴过来问你,代码可不可以给他复用,接口可以给他调用.这说明代码的复用和抽象对团队协作是很重要的.举个例子,如下图 ...
- 基于 Token 的身份验证:JSON Web Token(附:Node.js 项目)
最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...
- Maven遇到github引用的项目有bug怎么办?
Maven遇到github引用的项目有bug,自己想要修复/作者已经修复了但是还没有版本出来. 一个maven的做法 git clone 该项目(可能直接下载zip比较快). 在项目中mvn inst ...
随机推荐
- go GC垃圾回收原理
目录 1.前言 2. 垃圾回收算法 3. Golang垃圾回收 3.1 垃圾回收原理 3.2 内存标记(Mark) 3.3 三色标记 3.4 Stop The World 4. 垃圾回收优化 4.1 ...
- JS方式实现隐藏手机号码中间4位数
1.截取 function test (value) { const start = value.slice(0, 3) const end = value.slice(-4) return `${s ...
- 分布式协调组件Zookeeper之 选举机制与ZAB协议
Zookeeper简介: Zookeeper是什么: Zookeeper 是⼀个分布式协调服务的开源框架. 主要⽤来解决分布式集群中应⽤系统的⼀致性问题, 例如怎样避免同时操作同⼀数据造成脏读的问题. ...
- JavaWeb中表单数据的获取及乱码问题
首先使用一个用户提交界面作为举例(文本框,密码框,选择,下拉表单等),效果如下 注:HTML < form> 标签的 action 属性,其定义和用法是: 属性值为URL,表示向何处发送表 ...
- zabbix 历史数据处理
问题描述 zabbix server 平稳运行有一段时间了,但是最近问题却来了,今天早上收到zabbixserver磁盘空间不足的告警.通过查看之后发现是大部分数据是zabbix 库的的数据 在进一步 ...
- Kubernetes的安装部署
前言:简述kubernetes(k8s)集群 k8s集群基本功能组件由master和node组成. master节点上主要有kube-apiserver.kube-scheduler.kube-con ...
- MyBatis学习总结(五)——关联表查询的实现
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- 关于electron-vue打包后静态视频文件无法正常加载的问题解决方法
最近在使用electron-builder构建vue项目的时候发现在生产模式下视频可以正常加载并显示,但是一旦打包到开发环境下,视频就读取不出来了,控制台也并没有报错 一开始博主以为是路径问题,在将路 ...
- Tars | 第6篇 基于TarsGo Subset路由规则的Java JDK实现方式(下)
目录 前言 1. 修改.tars协议文件 1.1 Java源码位置及逻辑分析 1.2 Java语言实现方式 1.3 通过协议文件自动生成代码 1.4 变更代码的路径 2. [核心]增添Subset核心 ...
- web服务器之Ser-U和NFS
1. Ser-U加载页面目录/文件列表 2. Ser-U下载文件 3. NFS服务器加载目录/文件列表 4. NFS服务器下载文件 4. 对比分析 Ser-U服务器在传输服务器端的目录时,使用的为xm ...