3

最近、Qt5.1.0でプロジェクトを開始しました。
いくつかの開発の後、Google V8を使用してJavascriptでスクリプト システムを作成することにしました。Windows 7 x64では、 V8をコンパイルする唯一の方法は msvc2012であり、使用する .lib ファイルを 3 つ取得しました。V8 のみを使用 する単一のプロジェクトでは、すべてがうまく機能します。しかし、Qt5 を使用して V8 を既存のプロジェクトと統合するのは、もう少し複雑です。

私が使用している最小限のコードの例を次に示します: (もちろん、このプロジェクトにはさらに多くのファイルがあります...)

#include <QApplication>

#include <v8.h>

using namespace v8;

int v8_test() {
  Isolate* isolate = Isolate::GetCurrent();
  HandleScope handle_scope(isolate);
  Handle<Context> context = Context::New(isolate);
  Persistent<Context> persistent_context(isolate, context);
  Context::Scope context_scope(context);
  Handle<String> source = String::New("'Hello' + ', World!'");
  Handle<Script> script = Script::Compile(source);
  Handle<Value> result = script->Run();
  persistent_context.Dispose();
  String::AsciiValue ascii(result);
  printf("%s\n", *ascii);
  return 0;
}

int main(int ac, char **av)
{
    std::cout<<"Starting application"<<std::endl;
    QApplication app(ac, av);

    v8_test();

    //Do something else

    return app.exec();
}

この時点で、このタイプのリンク エラーが多数発生しました。

1>v8_base.x64.lib(api.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in moc_aCertainFile.obj
1>v8_base.x64.lib(v8threads.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in moc_aCertainFile.obj
1>v8_base.x64.lib(checks.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in moc_aCertainFile.obj

Qtはフラグ付きでコンパイルされたようで/MDd、V8はフラグ付きでしかコンパイルできません/MTd

多くの調査とテストの後、私は何も見つけることができませんでした...
誰もこの問題を解決する手がかりを得ましたか?

前もって感謝します。

4

2 に答える 2

2

Qt を静的にビルドしようと何度も試みた後でも、V8 と Qt5 をこの方法で使用することはできませんでした。

そこで、QtCreator のプロジェクトに統合できる V8 用の .dll ラッパーを作成しました。

これが私のラッパーです:

WrapTest.hh:

#ifndef WRAPTEST_HH_
#define WRAPTEST_HH_

#include <iostream>

namespace v8w {

    class WrapTest {
    public:
        static __declspec(dllexport) void   hello();
    };
}

#endif /* WRAPTEST_HH_ */

WrapTest.cpp:

#include <v8.h>

#include "WrapTest.hh"

void    v8w::WrapTest::hello() {
    std::cout<<"Hello, i'm V8 wrapper! :D"<<std::endl;
    v8::Isolate* isolate = v8::Isolate::GetCurrent();
    v8::HandleScope handle_scope(isolate);
    v8::Handle<v8::Context> context = v8::Context::New(isolate);
    v8::Persistent<v8::Context> persistent_context(isolate, context);
    v8::Context::Scope context_scope(context);
    v8::Handle<v8::String> source = v8::String::New("'Hello' + ', World!'");
    v8::Handle<v8::Script> script = v8::Script::Compile(source);
    v8::Handle<v8::Value> result = script->Run();
    persistent_context.Dispose();
    v8::String::AsciiValue ascii(result);
    printf("%s\n", *ascii);
    std::cout<<"End v8w::WrapTest::hello()"<<std::endl;
}

私はWrapTest.hhV8_Wrapper.lib、およびV8_Wrapper.dllを取得し、.lib を .pro ファイルに Qt5 プロジェクトに追加します。

LIBS += -L"$$_PRO_FILE_PWD_/lib"\
        -lV8_Wrapper

私の Qt プロジェクトでは、main.cpp ファイル:

#include <iostream>

#include <QApplication>

#include "WrapTest.hh"

void testV8() {
    std::cout<<"test"<<std::endl;
    v8w::WrapTest::hello();
}

int main(int ac, char **av) {
    std::cout<<"Starting application"<<std::endl;
    QApplication app(ac, av);   

    testV8();

    return app.exec();
}

標準出力で私に与えた:

Starting application
test
Hello, i'm V8 wrapper! :D
Hello, World!
End v8w::WrapTest::hello()

この解決策が必要な場合に役立つことを願っています^_^

于 2013-08-01T22:55:27.287 に答える