C ++ - mstc2012下的Qt + v8

时间:2013-08-01 10:06:53

标签: c++ qt visual-c++ linker v8

最近,我在 Qt5.1.0 下开始了一个项目 经过一些开发,我选择使用 Google V8 Javascript 下创建一个脚本系统。
Windows 7 x64 下,编译 V8 的唯一方法是在 msvc2012 下,我有3个.lib文件可供使用。
在一个项目使用ONLY 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标志。

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

    您还需要与WinMM.libWS2_32.libadvapi32.lib相关联,它们通常位于:C:\ Program Files(x86)\ Windows Kits \

    这使它成为我的系统。我希望它可以帮助其他人解决同样的问题。

答案 1 :(得分: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.hh V8_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()

我希望这个解决方案可以帮助你,如果你需要^ _ ^