v8编译
http://code.google.com/apis/v8/build.html
http://code.google.com/p/v8/wiki/BuildingOnWindows
環(huán)境:64位Windows7、vs2008
1、準(zhǔn)備:三個工具Subversion、Python、SCons。
設(shè)置環(huán)境變量保證在cmd中運(yùn)行 python --version、scons --version、svn --version 三個命令后能看到相應(yīng)的版本號。
2、下載v8
svn checkout http://v8.googlecode.com/svn/trunk/? v8
3、編譯v8
進(jìn)入到v8目錄,然后運(yùn)行:
scons env=”PATH:C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin;C:/Program Files (x86)/Microsoft Visual Studio 9.0/Common7/IDE;C:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE;C:/Program Files (x86)/Microsoft Visual Studio 9.0/Common7/Tools,INCLUDE:C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/include;C:/Program Files (x86)/Microsoft SDKs/Windows/v6.0A/Include;C:/Program Files/Microsoft SDKs/Windows/v6.0A/Include,LIB;C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/lib;C:/Program Files (x86)/Microsoft SDKs/Windows/v6.0A/Lib;C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib ”
也可以不在v8目錄里,這時要運(yùn)行:
scons –C <v8的路徑> env=”….”;
vs2008在64位win7里被分裂開了所以這個命令比32的麻煩。
/v8/obj文件夾里就是生成的文件
?
4、一個例子hello_world
v8文件夾里建一個hello_world.cpp
| ? int main(int argc, char* argv[]) {? // Create a string containing the JavaScript source code.? String source = String::New("'Hello' + ', World'");? // Compile the source code.? Script script = Script::Compile(source);?? // Run the script to get the result.? Value result = script->Run();? // Convert the result to an ASCII string and print it.? String::AsciiValue ascii(result);? printf("%s/n", *ascii);? return 0;} |
?
沒想到編譯這么簡單的一段代碼卻出了問題,用了一晚上外加一上午的時間搞定了問題。
一開始我是按照網(wǎng)站上說的運(yùn)行??? cl /Iinclude hello_world.cpp v8.lib
結(jié)果是:
用于 x64 的 Microsoft (R) C/C++ 優(yōu)化編譯器 15.00.30729.01 版版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。hello_world.cppMicrosoft (R) Incremental Linker Version 9.00.30729.01Copyright (C) Microsoft Corporation.? All rights reserved./out:hello_world.exehello_world.objv8.libhello_world.obj : error LNK2019: 無法解析的外部符號 "public: __cdecl v8::HandleScope::~HandleScope(void)" (??1HandleScope@v8@@QEAA@XZ),該符號在函數(shù) main 中被引用。。。。。。。。。。。。hello_world.exe : fatal error LNK1120: 11 個無法解析的外部命令 |
?
這個錯誤的原因是用錯了編譯器!!!v8目錄里的v8.lib是個32位的庫,所以應(yīng)該用“Visual Studio 2008 命令提示”,而我之前用的是“Visual Studio 2008 x64 Win64 命令提示”和“Visual Studio 2008 x64 兼容工具命令提示”。
運(yùn)行“Visual Studio 2008 命令提示”,然后進(jìn)入v8目錄,運(yùn)行cl /Iinclude hello_world.cpp v8.lib
結(jié)果:
| ? 用于 80x86 的 Microsoft (R) 32 位 C/C++ 優(yōu)化編譯器 15.00.30729.01 版版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。hello_world.cppMicrosoft (R) Incremental Linker Version 9.00.30729.01Copyright (C) Microsoft Corporation.? All rights reserved./out:hello_world.exehello_world.objv8.libv8.lib(api.obj) : 找到 MSIL .netmodule 或使用 /GL 編譯的模塊;正在使用 /LTCG 重新啟動鏈接;將 /LTCG 添加到鏈接命令行以改進(jìn)鏈接器性能Microsoft (R) Incremental Linker Version 9.00.30729.01Copyright (C) Microsoft Corporation.? All rights reserved./out:hello_world.exehello_world.objv8.libv8.lib(platform-win32.obj) : error LNK2001: 無法解析的外部符號 __imp__accept@12v8.lib(platform-win32.obj) : error LNK2001: 無法解析的外部符號 __imp__listen@8v8.lib(platform-win32.obj) : error LNK2001: 無法解析的外部符號 __imp__send@16。。。。。。。。。。。。。。。。。。v8.lib(platform-win32.obj) : error LNK2001: 無法解析的外部符號 __imp__connect@12hello_world.exe : fatal error LNK1120: 19 個無法解析的外部命令 |
錯誤的原因是沒有把"ws2_32.lib"、("WSock32.lib")、"Winmm.lib"加進(jìn)來。
解決辦法:
在hello_world.cpp里加入
#pragma comment(lib,"ws2_32.lib")#pragma comment(lib,"WSock32.lib")#pragma comment(lib,"Winmm.lib")#include <v8.h>using namespace v8; |
然后運(yùn)行 cl /Iinclude hello_world.cpp v8.lib
用于 80x86 的 Microsoft (R) 32 位 C/C++ 優(yōu)化編譯器 15.00.30729.01 版版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。hello_world.cppMicrosoft (R) Incremental Linker Version 9.00.30729.01Copyright (C) Microsoft Corporation.? All rights reserved./out:hello_world.exehello_world.objv8.libv8.lib(api.obj) : 找到 MSIL .netmodule 或使用 /GL 編譯的模塊;正在使用 /LTCG 重新啟動鏈接;將 /LTCG 添加到鏈接命令行以改進(jìn)鏈接器性能Microsoft (R) Incremental Linker Version 9.00.30729.01Copyright (C) Microsoft Corporation.? All rights reserved./out:hello_world.exehello_world.objv8.lib正在生成代碼已完成代碼的生成 |
?
這回Ok了 :P
也可以不用改 hello_world.cpp ,直接運(yùn)行??? v8>cl /Iinclude hello_world.cpp v8.lib Winmm.lib WSock32.lib ws2_32.lib
運(yùn)行v8目錄下的 hello_world.exe,輸出:Hello, World!
大功告成 :)
?
?
?
?
?
http://lch361.spaces.live.com/blog/cns!2C632B54B8D9AB49!435.entry
總結(jié)
- 上一篇: NP问题 笔记
- 下一篇: 动态链接库、静态库区别与VS2005项目