2014-10-26 57 views
2

我想在另一个Visual Studio C++项目中使用V8库。这不是我的日常生活环境,所以我可能会错过一些明显的东西。如何链接所需的库在Visual Studio C++项目中使用谷歌V8

我认为我所做的一切,因为它是在这里指出:
https://code.google.com/p/v8/wiki/BuildingWithGYP


签出以下回购:

svn co http://src.chromium.org/svn/trunk/tools/third_party/python_26 third_party/python_26 --revision 89111 
svn co http://src.chromium.org/svn/trunk/deps/third_party/cygwin third_party/cygwin --revision 66844 
svn co https://src.chromium.org/chrome/trunk/deps/third_party/icu52 third_party/icu --revision 277999 
svn co http://googletest.googlecode.com/svn/trunk testing/gtest --revision 643 
svn co http://googlemock.googlecode.com/svn/trunk testing/gmock --revision 410 
从V8项目在CMD窗口中的根

然后我跑了:

python build\gyp_v8 -Dcomponent=static_library -Dtarget_arch=x64 -Dv8_enable_i18n_support=0 -Dv8_use_snapshot=0 

...得到了:

Updating projects from gyp files... 
Warning: Missing input files: 
C:\...\v8\tools\gyp\..\..\src\uri.h 
C:\...\v8\tools\gyp\..\..\src\feedback-slots.h 
Running build/landmines.py... 

接下来,我跑:

"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.com" /build Release build\All.sln 

...并得到了:

(...) 
19>------ Build started: Project: All, Configuration: Release x64 ------ 
========== Build: 18 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

从我得到了我认为失败的一个测试项目中的错误:

…18>C:\...\v8\testing\gtest\include\gtest/internal/ 
gtest-param-util.h(393): error C2868: 'testing::internal::TestMetaFactory<v8::in 
ternal::compiler::MachineStoreOperatorTest_ParameterIsCorrect_Test>::ParamType' 
: illegal syntax for using-declaration; expected qualified-name (compiler\machin 
e-operator-unittest.cc)… 

之后,我在Visual Studio中创建了新的C++ Empty项目。添加一个文件到源文件节点此示例内容:

#include <include\v8.h> 
#include <include\libplatform\libplatform.h> 

using namespace v8; 

Local<Array> NewPointArray(int x, int y, int z) { 
    v8::Isolate* isolate = v8::Isolate::GetCurrent(); 

    // We will be creating temporary handles so we use a handle scope. 
    EscapableHandleScope handle_scope(isolate); 

    // Create a new empty array. 
    Local<Array> array = Array::New(isolate, 3); 

    // Return an empty result if there was an error creating the array. 
    if (array.IsEmpty()) 
    return Local<Array>(); 

    // Fill out the values 
    array->Set(0, Integer::New(isolate, x)); 
    array->Set(1, Integer::New(isolate, y)); 
    array->Set(2, Integer::New(isolate, z)); 

    // Return the value through Escape. 
    return handle_scope.Escape(array); 
    } 

int main(){} 

我添加的路径到我的C/C++早期检出的V8项目的根文件夹 - >常规 - >附加包含目录属性(而不是Visual Studio项目,因为那里没有v8头文件)。

我还在链接器 - >常规 - >其他库目录属性中添加了来自同一个v8项目的build \ Release \ lib文件夹的路径。该文件夹包含以下内容:

gmock.lib 
gtest.lib 
v8_base.lib 
v8_libbase.lib 
v8_libplatform.lib 
v8_nosnapshot.lib 

接下来应该做什么。

当我尝试生成项目在Visual Studio我得到:

1>------ Build started: Project: SOProject, Configuration: Debug Win32 ------ 
1>Source.obj : error LNK2019: unresolved external symbol "public: __thiscall v8::HandleScope::~HandleScope(void)" ([email protected]@@[email protected]) referenced in function "public: __thiscall v8::EscapableHandleScope::~EscapableHandleScope(void)" ([email protected]@@[email protected]) 
1>Source.obj : error LNK2019: unresolved external symbol "public: __thiscall v8::EscapableHandleScope::EscapableHandleScope(class v8::Isolate *)" ([email protected]@@[email protected]@[email protected]@Z) referenced in function "class v8::Local<class v8::Array> __cdecl NewPointArray(int,int,int)" ([email protected]@[email protected]@[email protected]@@[email protected]@[email protected]) 
1>Source.obj : error LNK2019: unresolved external symbol "private: class v8::internal::Object * * __thiscall v8::EscapableHandleScope::Escape(class v8::internal::Object * *)" ([email protected]@[email protected]@[email protected]@[email protected]@@Z) referenced in function "public: class v8::Local<class v8::Array> __thiscall v8::EscapableHandleScope::Escape<class v8::Array>(class v8::Local<class v8::Array>)" ([email protected]@[email protected]@@[email protected]@@[email protected]@[email protected]@@[email protected]@@Z) 
1>Source.obj : error LNK2019: unresolved external symbol "public: static class v8::Local<class v8::Integer> __cdecl v8::Integer::New(class v8::Isolate *,int)" ([email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@[email protected]@Z) referenced in function "class v8::Local<class v8::Array> __cdecl NewPointArray(int,int,int)" ([email protected]@[email protected]@[email protected]@@[email protected]@[email protected]) 
1>Source.obj : error LNK2019: unresolved external symbol "public: bool __thiscall v8::Object::Set(unsigned int,class v8::Handle<class v8::Value>)" ([email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@Z) referenced in function "class v8::Local<class v8::Array> __cdecl NewPointArray(int,int,int)" ([email protected]@[email protected]@[email protected]@@[email protected]@[email protected]) 
1>Source.obj : error LNK2019: unresolved external symbol "public: static class v8::Local<class v8::Array> __cdecl v8::Array::New(class v8::Isolate *,int)" ([email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@[email protected]@Z) referenced in function "class v8::Local<class v8::Array> __cdecl NewPointArray(int,int,int)" ([email protected]@YA?AV?$L[email protected]@[email protected]@@[email protected]@[email protected]) 
1>Source.obj : error LNK2019: unresolved external symbol "public: static class v8::Isolate * __cdecl v8::Isolate::GetCurrent(void)" ([email protected]@[email protected]@[email protected]) referenced in function "class v8::Local<class v8::Array> __cdecl NewPointArray(int,int,int)" ([email protected]@[email protected]@[email protected]@@[email protected]@[email protected]) 
1>D:\PROGRAMMING\!VisualStudioProjects\SOProject\Debug\SOProject.exe : fatal error LNK1120: 7 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

我应该怎么读呢?从其他职位,如:

How to compile the smallest possible V8 library for Windows?
https://groups.google.com/forum/#!topic/v8-users/KhniGgixxGM
Embedding v8 with Visual C++ 2010

...我得到我需要另一个链接库。

究竟是哪些,为什么这些以及如何在Visual Studio中完全链接它们。当然,我尝试了不同的组合和解决方案,但没有任何积极的结果

在此先感谢。

+0

目标平台,调试级别和代码生成选项为您的项目应该与那些在图书馆指定,即它不是可以将“Release x64”库与“Debug Win32”二进制文件链接起来,可以构建x86库的调试版本或配置可执行文件的x64版本构建。还要检查项目和库中的“C/C++ - >代码生成 - >运行时库”选项,它也必须匹配(默认情况下,它是多版本DLL,可能应该更改为多线程) – dewaffled 2014-10-26 21:21:15

回答

4

我是一所学校的学生,我们在两个学期的课程中为我们的一个班级制作视频游戏。目前我们正在努力让V8集成为我们的游戏引擎提供脚本功能。我们在将V8集成到引擎本身时遇到了一些障碍,并且根据我们什么时候完全解决这些问题,最终我会在冬季假期或暑假期间撰写大量博客文章。我将详细介绍如何在Windows应用程序中启动和运行V8,并且更具体地说是针对视频游戏。但是与此同时,我至少可以告诉你我们如何为Windows创建V8,以及如何通过我们的游戏项目使它成为可访问的。

  1. 安装Python 2.x,并确保它被添加到您的PATH。如果您不知道,您可以编辑您的PATH,右键单击并选择我的电脑/本电脑的属性。然后,您可以通过单击“更改设置”,转至“高级”选项卡并单击“环境变量”来检查PATH。编辑“路径”变量,并确保C:\Python27或其他任何内容。分号分隔PATH条目。另外,确保你已经安装了Python 3.x,它不在你的PATH中。你可以随时把它放回来,如果它是,你需要它,但如果它确实存在,现在删除它。

  2. 安装SVN,并确保它被添加到您的路径。我非常讨厌SVN,所以我不愿意为Windows本地安装它,而只是将它安装为我的cygwin包的一部分。然后我把C:\cygwin64\bin放在我的PATH中。

  3. 找出你要完成所有这些工作的位置,并在那里创建一个名为v8.cmd的新文件。 (cmd文件是Windows批处理文件,如果你不知道的话)。对于我来说,我只是把它放在我的辅助硬盘驱动器的根目录D :.所以我有D:\v8.cmd

  4. 编辑v8.cmd,把下面的文件的内容,保存并退出:

    svn checkout http://v8.googlecode.com/svn/tags/3.28.57/ v8-build 
    svn checkout http://src.chromium.org/svn/trunk/deps/third_party/[email protected] v8-build/third_party/cygwin 
    svn checkout http://gyp.googlecode.com/svn/[email protected] v8-build/gyp 
    
    mkdir v8 
    mkdir v8\lib 
    mkdir v8\lib\Release 
    mkdir v8\lib\Debug 
    mkdir v8\include 
    
    call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat" 
    
    set CYGWIN_ROOT=%cd%\v8-build\third_party\cygwin 
    set PATH=%CYGWIN_ROOT%\bin;%PATH% 
    set PYTHONPATH=%cd%\v8-build\gyp\pylib 
    
    call v8-build\third_party\cygwin\setup_mount.bat 
    call v8-build\third_party\cygwin\setup_env.bat 
    
    python v8-build\build\gyp_v8 -Dcomponent=static_library -Dtarget_arch=ia32 -Dv8_enable_i18n_support=0 -Dv8_use_snapshot=0 
    
    msbuild /m /p:UseEnv=true /p:Configuration=Release /p:Platform=x86 v8-build\tools\gyp\v8.vcxproj 
    msbuild /m /p:UseEnv=true /p:Configuration=Release /p:Platform=x86 v8-build\tools\gyp\v8_libplatform.vcxproj 
    msbuild /m /p:UseEnv=true /p:Configuration=Release /p:Platform=x86 v8-build\tools\gyp\v8_libbase.vcxproj 
    msbuild /m /p:UseEnv=true /p:Configuration=Debug /p:Platform=x86 v8-build\tools\gyp\v8.vcxproj 
    msbuild /m /p:UseEnv=true /p:Configuration=Debug /p:Platform=x86 v8-build\tools\gyp\v8_libplatform.vcxproj 
    msbuild /m /p:UseEnv=true /p:Configuration=Debug /p:Platform=x86 v8-build\tools\gyp\v8_libbase.vcxproj 
    
    xcopy /y /c "v8-build\build\Debug\lib\*.lib" "v8\lib\Debug\" 
    xcopy /y /c "v8-build\build\Release\lib\*.lib" "v8\lib\Release\" 
    xcopy /y /c /s "v8-build\include\*.h" "v8\include\" 
    pause 
    
  5. 启动管理员命令提示符。在Windows 8(也许是7?)中,可以通过右键单击开始按钮(或屏幕的左下角)并单击命令提示符(admin)来执行此操作。

  6. 导航到v8.cmd的位置,并通过键入“v8.cmd”来运行它。这确实几件事情:

    • 创建“V8建造”的文件夹,然后从SVN签出必要的东西来构建库(V8,对于GYP cygwin的V8需求,并GYP)。

    • 创建一个“v8”文件夹,这是您的项目的最终内容将被构建的地方。

    • 设置从此脚本轻松运行Visual Studio生成系统所必需的环境变量。假设您使用的是Visual Studio 2013.

    • 设置使用cygwin和Python的V8“版本”所需的环境变量。

    • 调用一些批处理文件,做一些更多的环境变量的东西,我不知道,他们来与V8。

    • 使用现在V8的Python版本运行gyp。这将生成Visual Studio项目文件,这些文件在生成时会为您提供必要的库。 (注意:这整个事情假设你想静态链接V8到你的项目,而不想使用DLL。)

    • 现在,如果我们可以构建一个Visual Studio解决方案,因为这就是解决方案,一次构建多个项目,但gyp是一块废话,它构建的解决方案并不是很酷,工作。因此,我们必须单独建立我们想要的每个项目。这就是批处理文件中有六个单独的“msbuild”行的原因。

    • 构建库之后,将输出库文件以及必要的头文件复制到v8 /文件夹。

    • 我们完成了!

  7. 好的,现在我们需要包含在我们项目中的所有东西都放在v8 /文件夹中。现在,快速抛开我的团队如何建立我们的项目。我们的解决方案是这样的:

    [+] OmniArch/      Solution root folder 
    | 
    +--[+] include/      Folder for all external library .h files 
    | | 
    | +-- v8.h 
    | +-- v8config.h 
    | +-- v8-debug.h 
    | +-- v8-platform.h 
    | +-- v8-preparser.h 
    | +-- v8-profiler.h 
    | +-- v8stdint.h 
    | +-- v8-testing.h 
    | +-- v8-util.h 
    | 
    +--[+] lib/       Folder for all external library .lib files 
    | | 
    | +--[+] Debug/ 
    | | | 
    | | +-- v8_base.lib 
    | | +-- v8_libbase.lib 
    | | +-- v8_libplatform.lib 
    | | +-- v8_nosnapshot.lib 
    | | 
    | +--[+] Release/ 
    |  | 
    |  +-- v8_base.lib 
    |  +-- v8_libbase.lib 
    |  +-- v8_libplatform.lib 
    |  +-- v8_nosnapshot.lib 
    | 
    +--[+] OmniArch/     Folder for the "OmniArch" project 
    | 
    +--[+] OmniEngine/     Folder for the "OmniEngine" project 
    | 
    +-- OmniArch.sln     The solution file 
    

    本指南的其余部分将解释如何将包括V8,假设你的文件夹结构如下所示。如果你不想让你看起来像这样,相应地修改东西。无论如何,将v8 /文件夹的内容复制到解决方案根文件夹中。如果您之前没有lib/include/文件夹,现在您可以做了,如果您确实有这些文件夹,现在它们中有更多文件。

  8. 在Visual Studio中,右键单击您的项目(项目,而不是解决方案),然后单击属性。确保顶部的框设置为“全部配置”,而不是“调试”或“发布”。在“配置属性”下,选择“VC++目录”。

    • 在“库目录”行的末尾,加上分号,其次是

      $(SolutionDir)lib;$(SolutionDir)lib\$(Configuration) 
      
    • 在的“包含目录”末,把一个分号,其次是

      $(SolutionDir)include 
      
  9. 仍然在属性页面的“配置属性” - >“连接器” - >“输入” - > “附加依赖”(或 “配置属性” - > “馆员” - > “常规” - > “附加依赖”),如果需要添加以下,使用分号:

    v8.lib;v8_base.lib;v8_libbase.lib;v8_nosnapshot.lib;v8_libplatform.lib;WS2_32.lib;Winmm.lib 
    

如果您的配置选项对于“调试”和“发布”不同,请更改为其中的每一个,然后添加上述选项,而不是覆盖这两个选项。

  1. 现在你应该完全准备好构建。你应该能够

    #include "v8.h" 
    

就了事。而且你应该能够无误地构建。

让我知道这是否有帮助,如果你遇到任何问题。我花了四天的时间把我的头撞到墙上来完成这项工作。

+0

为什么禁用快照?快照功能不应该提高性能吗? – Boinst 2015-01-21 04:19:52

+0

我正在尝试构建x64。我已经替换了批处理中的明显部分,但使用MSBuild构建每个.vcxproj都会给我带来类似“致命错误C1189:#error:目标架构x64仅在x64主机上受支持”的错误。为x64构建.sln成功,但我在输出中找不到v8_libbase.lib ... – Rast 2015-01-23 14:18:33

+0

是不是v8.lib?我已将所有这些库重新引用,并且外部函数如'__declspec(dllimport)public:bool __thiscall v8 :: Value :: IsStringObject(void)const“(__imp_?IsStringObject @ Value @ v8 @@ QBE_NXZ)'无法解析。 – 2015-02-03 17:09:44

0

当您设置“链接器 - >常规 - >其他库目录”属性时,您只添加了链接器应搜索V8库的路径。

附加这些V8库到“链接器 - >输入 - >附加依赖”属性:

v8_base.lib;v8_libbase.lib;v8_libplatform.lib;v8_nosnapshot.lib 
+0

我的项目正在寻找一个不存在的v8.lib,这对静态链接到其他C++项目有效吗? – 2015-02-03 17:18:37

相关问题