最近,我在 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
标志。
经过大量的研究和测试,我无法找到任何东西......
任何人都有线索来解决这个问题?
提前致谢。
答案 0 :(得分:3)
Google V8默认使用MT
标记构建,因此与使用MD
标记构建的Qt不兼容。
使用Qt构建V8的技巧是在Visual Studio中使用MD
标志进行V8编译。您可以使用以下方法执行此操作:
在QtCreator中继续进行V8库的链接:
LIBS += -L/PATH_TO_LIBRARIES/ -lv8_base.ia32 -licui18n -licuuc -lv8_nosnapshot.ia32 -lv8_snapshot
您还需要与WinMM.lib
,WS2_32.lib
和advapi32.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()
我希望这个解决方案可以帮助你,如果你需要^ _ ^