在构建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

本文关键字:gyp binding cpp 文件 Objective-C 编译 通过 js Node 构建 Node-webkit      更新时间:2023-10-16

我有一个预先存在的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文件扩展名。

要将所有.cpp文件编译为Objective-C++,请将以下内容添加到binding.gyp:
'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"
        ]
    }]
]