3

最近,我在Qt5.1.0下启动了一个项目。经过一番开发,我选择用Google V8在Javascript
下做一个脚本系统。 在Windows 7 x64下,编译V8的唯一方法是在msvc2012下,我有 3 个 .lib 文件可供使用。在仅使用 V8 的单个项目中,一切正常。但是将 V8 与使用 Qt5 的现有项目集成起来有点复杂。

这是我正在使用的最小代码示例:(当然,这个项目中有更多文件......)

#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是用/MDdflag编译的,V8只能编译/MTdflag。

经过大量的研究和测试,我找不到任何东西......
有人有解决这个问题的线索吗?

提前致谢。

4

2 回答 2

3

Google V8 默认使用MT标志构建,因此与使用标志构建的 Qt 不兼容MD

让它使用 Qt 构建 V8 的技巧是在带有MD标志的 Visual Studio 中进行 V8 编译。您可以使用以下方法执行此操作:

  1. 通过执行 build\gyp_v8.py 生成 Visual Studio 项目。
  2. 使用 Visual Studio 打开 all.sln。
  3. 在解决方案的所有项目中设置 MD 标志:属性 > C/C++ > 代码生成 > 运行时库 > 多线程 DLL (/MD)
  4. 之后重建解决方案
  5. 您将获得与 QtCreator 一起使用的正确 lib 文件。

在 QtCreator 中进行 V8 库的链接:

LIBS += -L/PATH_TO_LIBRARIES/ -lv8_base.ia32 -licui18n -licuuc -lv8_nosnapshot.ia32 -lv8_snapshot

您还需要链接WinMM.lib,WS2_32.libadvapi32.lib,它们通常位于:C:\Program Files (x86)\Windows Kits\

这使它在我的系统上。我希望它可以帮助其他有同样问题的人。

于 2014-02-17T21:04:40.597 回答
2

好吧,即使在多次尝试以静态方式构建 Qt 之后,我也无法以这种方式使用 V8 和 Qt5。

因此,我为 V8 编写了一个 .dll 包装器,它可以集成到我在 QtCreator 上的项目中。

这是我的包装:

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.libV8_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 回答