3

nodejsアドオンを作成しています。Visual Studio プロジェクトに 5 つのファイルがあります。

comm.h/cc, node_main.cc, util.h/cc

ライブラリとリンクするnode.lib

node_main.cc には次の機能があります。

v8::Handle<v8::Value> StartMethod(const v8::Arguments &args) {
    v8::HandleScope scope(args.GetIsolate()); // node_isolate
    int length = args.Length();
    std::vector<std::unique_ptr<char[]>> argv;
    for(int i=0;i<length;++i) {
        if(args[i]->IsString()) {
            v8::String::Utf8Value str(args[i]);
            const int strLen = ToCStringLen(str);
            if(strLen) {
                std::unique_ptr<char []> data(new char[strLen+1]);
                strcpy_s(data.get(), strLen+1, ToCString(str));
                argv.push_back(std::move(data));
            }
        }
    }
    return scope.Close(v8::Int32::New(MainMethod(argv.size(), &(argv[0]._Myptr))));
}

ソリューションをビルドすると、次のリンカー エラーが発生します。

1>node.lib(node.exe) : error LNK2005: "public: bool __thiscall v8::Value::IsString(void)const " (?IsString@Value@v8@@QBE_NXZ) already defined in communicator.obj
1>node.lib(node.exe) : error LNK2005: "public: class v8::Local<class v8::Value> __thiscall v8::Arguments::operator[](int)const " (??AArguments@v8@@QBE?AV?$Local@VValue@v8@@@1@H@Z) already defined in communicator.obj
1>node.lib(node.exe) : error LNK2005: "public: int __thiscall v8::Arguments::Length(void)const " (?Length@Arguments@v8@@QBEHXZ) already defined in communicator.obj
1>node.lib(node.exe) : error LNK2005: "public: class v8::Isolate * __thiscall v8::Arguments::GetIsolate(void)const " (?GetIsolate@Arguments@v8@@QBEPAVIsolate@2@XZ) already defined in communicator.obj

関数IsString(), Arguments::[] and GetIsolate()は でのみ使用されhello.ccArguments::Length()で使用されcommunicator.ccます。それでも、すべてのエラーは を参照しcommunicator.ccます。

私はccファイルの関数を呼び出しているだけで、新しい定義はありません。

何が問題ですか ?

前もって感謝します。

4

1 に答える 1

3

私は同じ問題を抱えていました。ここで解決策を見つけました。すべての #include <v8.h> の前に #include <node.h> を配置します。

于 2013-09-24T10:34:44.960 に答える