Компиляция файла .cpp как Objective-C ++ с помощью binding.gyp при сборке дополнений Node.js / Node-webkit

У меня есть существующая статическая библиотека C ++, которую я переношу, чтобы ее можно было компилировать как дополнение для Node.js / Node-webkit. Чтобы создать это дополнение, я запускаю node-gyp / nw-gyp в созданном мной файле binding.gyp. Эта статическая библиотека является мультиплатформенной и компилируется для Windows, Mac и Linux через VisualStudio, Xcode и CMake соответственно. Эта статическая библиотека уже используется в различных приложениях (читай, она, вероятно, не будет подвергнута рефакторингу только для этого одного случая компиляции аддонов — который все еще находится на этапе проверки концепции).

Все кроссплатформенные файлы C ++ имеют расширение .cpp, хотя некоторые из них на самом деле скомпилированы на Mac как Objective-C ++ (чтобы использовать некоторые тонкости Cocoa). В Xcode на Mac я могу скомпилировать такие файлы .cpp, как Objective-C ++, переключив «тип» для файла с «Default — C ++ Source» на «Objective-C ++ Source» в «File Inspector». Это удобно, так как я могу иметь тот же файл, который компилируется как C ++ в Windows / Linux и Obj-C ++ в Mac, независимо от расширения файла .cpp. Для создания аддона я использую парадигму ObjectWrap. Чтобы обернуть классы Objective-C ++, я должен включить их файлы .h, что заставляет сценарий Objective-C ++ на уровне аддона.

Я довольно новичок в использовании node-gyp и nw-gyp. Есть ли какие-либо дополнительные квалификаторы, которые я могу добавить в свой файл binding.gyp, чтобы явно указать, что данный файл .cpp на самом деле должен быть скомпилирован как Objective-C ++, аналогично параметру ‘type’ в Xcode, который я упоминал выше? В качестве промежуточного шага при создании доказательства концепции я успешно смог получить файлы .mm для компиляции в Objective-C ++. Однако, как уже упоминалось выше, многие из этих файлов на самом деле являются мультиплатформенными и должны компилироваться как простой C ++ в Windows / Linux, как только я перенесу свое подтверждение концепции на другие платформы, и поэтому я бы предпочел, чтобы они сохранили расширение файла .cpp.

3

Решение

Чтобы скомпилировать все файлы .cpp как Objective-C ++, добавьте следующее в binding.gyp:

'conditions': [
['OS=="mac"', {
'xcode_settings': {
'OTHER_CFLAGS': [
'-ObjC++'
]
}
}]
]

Если вам нужно скомпилировать только некоторые файлы .cpp в качестве Objective-C ++, создайте файл .mm, который включает только файлы .cpp, которые должны быть скомпилированы как Objective-C ++. В binding.gyp используйте условия для компиляции файла оболочки .mm или файлов .cpp в зависимости от платформы.

В файле .mm:

#include "file.cpp"

В обязательном порядке.

'conditions': [
['OS=="mac"', {
'sources': [
"file.mm"]
}],
['OS=="win"', {
'sources': [
"file.cpp"]
}]
]
0

Другие решения


По вопросам рекламы [email protected]