在Mac下使用libc++编译v8

Posted on June 12, 2016

Mac从10.7开始,系统默认的标准库改成了libc++,支持c++11标准,系统里也还有之前的libstdc++,但它是一个固定的旧版本,不支持c++11标准。虽然大的趋势是都使用libc++,但是还有不少老项目在使用libstdc++编译,导致跟其它库混合使用的时候可能会出现链接错误。chrome v8 就是这样,默认的编译配置是依赖libstdc++的而不是libc++,导致编译出来的静态库放到Skia项目里无法直接使用(Skia默认编译配置是依赖libc++)。要解决这个问题,我们编译一个libc++版的v8静态库即可。

在终端进入v8目录后,分别执行以下命令就可以了:

export CXX="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -std=c++11 -stdlib=libc++"

export LINK="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -std=c++11 -stdlib=libc++"

export GYP_DEFINES="clang=1 mac_deployment_target=10.7"

make native

目前只找到使用 make 命令的这种方式可以生成libc++版的v8静态库,使用 gyp/ninja 的还不行。所以编译过程会比较慢,耐心等一会,然后在 out/native/ 下就可以找到生成的静态库。

很奇怪,后来看了下chromium项目里,在Mac上也是直接用libc++编译v8的,但是v8项目的默认编译配置却是依赖libstdc++的,不知道是不是来不及更新还是有历史原因。理论上,如果用libc++编译的话,Mac最低就只能支持到10.7版本以上。又看了一下chrome的下载页面,发现它在Mac上最低支持版本居然是10.9。所以应该完全不用考虑10.6了,全都使用libc++编译合情合理。