Node.js'deki bir C ++ kitaplığını nasıl kullanabilirim?
Node.js'deki bir C ++ kitaplığını nasıl kullanabilirim?
Yanıtlar:
Bak düğüm-ffi .
node-ffi, saf JavaScript kullanarak dinamik kitaplıkları yüklemek ve çağırmak için bir Node.js eklentisidir. Herhangi bir C ++ kodu yazmadan yerel kitaplıklara bağlamalar oluşturmak için kullanılabilir.
Şimdi bu soruya yeni bir cevap var. SWIG , 3.0 sürümünden itibaren Node.js, Webkit ve v8 için javascript arayüz oluşturucuları sağlıyor gibi görünmektedir .
Bir süredir Java ve Python için kapsamlı olarak SWIG kullanıyorum ve SWIG'nin nasıl çalıştığını anladıktan sonra, C ++ kodunu SWIG'nin kullandığı dillerle arayüzlemek için neredeyse hiç çaba (hedef dildeki ffi veya eşdeğeriyle karşılaştırıldığında) gerekmiyor. destekler.
Küçük bir örnek olarak, myclass.h başlıklı bir kitaplığınız olduğunu varsayalım:
#include<iostream>
class MyClass {
int myNumber;
public:
MyClass(int number): myNumber(number){}
void sayHello() {
std::cout << "Hello, my number is:"
<< myNumber <<std::endl;
}
};
Bu sınıfı düğümde kullanmak için, aşağıdaki SWIG arayüz dosyasını (mylib.i) yazmanız yeterlidir:
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Bağlama dosyası bağlama.gyp oluşturun:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Aşağıdaki komutları çalıştırın:
swig -c++ -javascript -node mylib.i
node-gyp build
Şimdi, düğümü aynı klasörden çalıştırarak şunları yapabilirsiniz:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Bu kadar küçük bir örnek için 2 arayüz dosyası yazmamız gerekmesine rağmen, hiçbir yerde MyClass
yapıcıdan veya sayHello
yöntemden bahsetmek zorunda olmadığımıza dikkat edin , SWIG bunları keşfeder ve otomatik olarak doğal arayüzler oluşturur.
std::vector<>
örneğin, sadece %include "std_vector.i"
) bir nesne döndürmesi için işlevinizi C ++ 'a sarmaktır ve bunu javascript tarafında biraz garip bir şekilde işleyebileceksiniz. Bu yaklaşımın FFI'yı kendiniz yazmaktan çok daha kolay ve güvenli olduğunu unutmayın.
C ++ kodunuz için bağlamalar sağlamak için bir node.js uzantısı kullanabilirsiniz. İşte bunu kapsayan bir eğitim:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
C ++ kodunu js'ye derlemek için emscripten kullanabilirsiniz .
İşte C ++ 'nızı Node.js ile Web'e Alma hakkında ilginç bir makale
C ++ kodunu bir Node.js uygulamasıyla entegre etmenin üç genel yolu - her kategoride çok sayıda varyasyon olsa da:
- Otomasyon - C ++ 'nızı alt süreçte bağımsız bir uygulama olarak arayın.
- Paylaşılan kitaplık - C ++ rutinlerinizi paylaşılan bir kitaplıkta (dll) paketleyin ve bu rutinleri doğrudan Node.js'den çağırın.
- Node.js Eklentisi - C ++ kodunuzu yerel bir Node.js modülü / eklentisi olarak derleyin.
Swig ve C ++ konusunda dikkatli olun: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
SWIG'yi C ++ kaynak dosyalarında (.C veya .cxx dosyasında görünen dosyalar) çalıştırmanız önerilmez. SWIG, C ++ sınıf bildirimlerini ayrıştırabilse de, orijinal sınıf tanımlarından ayrılmış bildirimleri yok sayar (bildirimler çözümlenir, ancak birçok uyarı mesajı üretilebilir). Örneğin:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
C ++ sınıfının yalnızca bir .h dosyasıyla sınırlı olması nadirdir.
Ayrıca, JavaScript'i destekleyen swig sürümleri swig-3.0.1 veya üstüdür.
foo::bar
Zaten SWIG'nin tanımıyla ne yapacağını anlamıyorum . Bir sınıf üyesinin tanımı tamamen uygulama ile ilgilidir; SWIG'nin oluşturduğu sarmalayıcılar tamamen arayüzle ilgilidir.
extension
. Google c ++ nodejs uzantısı