在构建Node.js/Node-webkit插件时,通过binding.gyp将.cpp文件编译为Objective-C
Compiling .cpp file as Objective-C++ via binding.gyp when building Node.js/Node-webkit addons
我有一个预先存在的C++静态库,我正在将其移植为Node.js/Node webkit的插件。为了构建这个插件,我正在创建的binding.gyp文件上运行node-gyp/nw-gyp。这个静态库是多平台的,分别通过VisualStudio、Xcode和CMake为Windows、Mac和Linux编译。这个静态库已经在各种应用程序中使用过(请注意,它可能不会仅仅针对这一个插件编译案例进行重构——它仍处于概念验证阶段)。
所有的跨平台C++文件都有.cpp文件扩展名,尽管其中一些文件实际上是在Mac上编译为Objective-C++的(以便利用Cocoa的一些细节)。在Mac上的Xcode中,我可以通过在"文件检查器"中将文件的"类型"从"Default-C++Source"切换为"Objective-C++Source",将.cpp文件编译为Objective-C++。这很方便,因为无论.cpp文件扩展名如何,我都可以在Windows/Linux上编译与C++和在Mac上编译Obj-C++相同的文件。为了构建插件,我使用了ObjectWrap范式。为了包装Objective-C++类,我必须包含它们的.h文件,这将在插件级别强制使用Objective-CC++场景。
我对使用node-gip和nw-gip比较陌生。有没有其他限定符可以添加到我的binding.gyp文件中,明确表示给定的.cpp文件实际上应该编译为Objective-C++,类似于我上面提到的Xcode中的"type"设置?作为构建概念验证的临时步骤,我成功地获得了将.mm文件编译为Objective-C++的文件。然而,正如上面提到的,这些文件中的许多实际上是多平台的,一旦我将概念验证转移到其他平台上,就应该在Windows/Linux上作为直接的C++进行编译,因此我更希望它们保留.cpp文件扩展名。
'conditions': [
['OS=="mac"', {
'xcode_settings': {
'OTHER_CFLAGS': [
'-ObjC++'
]
}
}]
]
如果只需要将一些.cpp文件编译为Objective-C++,请创建一个.mm文件,该文件只包括应编译为Objective-C++的.cpp文件。在binding.gyp中,根据平台使用条件编译.mm包装文件或.cpp文件。
在文件.mm:中
#include "file.cpp"
装订中。gyp:
'conditions': [
['OS=="mac"', {
'sources': [
"file.mm"
]
}],
['OS=="win"', {
'sources': [
"file.cpp"
]
}]
]
- node-gyp 在 macOS 上未正确链接库
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- NodeJS:node-gyp 编译与等效的 gcc -lm 选项
- 在node-gip binding.gyp文件中,如何根据系统结构(32位、64位)包含不同的库文件
- protobuf in C++ with dynamic binding for google::protobuf::M
- binding.gyp:如何使用"copies"部分在多个位置复制文件
- 在没有节点GYP的目标平台上编译C/C 文件
- Mac 上的 node-gyp 构建错误"calling a protected constructor of class 'v8::HandleScope'"
- Binding C++ and Fortran
- 迫使节点GYP使用C 11
- 如何在节点GYP构建过程中包括Tesseract库
- 节点插件节点-gyp 构建缺少 V8 dll 的
- g++ 构建错误与 node-gyp 重建 Node.js 插件
- node-gyp - 处理".h.in"文件
- 如何将CMake项目与基于GYP的库集成
- SQLite Binding Numaric 数据类型
- 使用节点GYP预定义的变量product_dir
- 构建时的节点-gyp 链接库依赖项
- 在构建Node.js/Node-webkit插件时,通过binding.gyp将.cpp文件编译为Objective-C