使用gyp構建項目,使用ninja更快的編譯,以及使用出現和解決的問題記錄

原文:木木老蔫 | http://www.akmumu.com/2014/04/10/265/.html

GYP是什麼

GYPGenerate Your Projects的縮寫

當構建項目的時候就要用到GYP了,尤其是當跨平臺的項目時,用不同的平臺看代碼以及編譯,不能每個都手動一個個的新建項目等,而且項目多了有很多預編譯的宏,項目依賴等有可能遺忘導致各平臺看到的代碼和編譯的結構有差別,gyp可以讓你只寫一個gyp文件在各平臺生成不同的項目文件,比如在windows下生成.sln的文件,這個可以用vs打開一個項目空間,裏面有你希望看到的各個項目。你可以查看代碼並編譯。

linux下生成ninja文件,使用ninja編譯

mac下就可以生成xcode能打開.xcodeproj文件。

而這些你只要寫一個.gyp文件就可以了。而且使用ninja可以在各個平臺上進行編譯。速度更快。

GYP結構

GYP的輸入是.gyp和.gypi文件,.gypi文件是用於.gyp文件include使用的。.gyp文件就是符合特定格式的json文件。

gyp文件中包含target,Visual C++下,gyp生成sln,target生成vcproj或vxcproj。

如果你下載了chromium的源碼,那麼chromium中GYP結構是,通過命令行統一使用build/common.gypi的公共文件,工程的配置,選項的處理,編譯選項的使用,都是在這個文件中配置,所有造成了這個文件超級大,129KB。生成一個總工程all.gyp,這個工程依賴於其他所有的工程,這個工程生成,所有工程都生成完成。而且有一個總工程也方便開發。

可以向他的結構和寫法學習,寫出能夠滿足自己需求的gyp文件。

定製生成工程

現在默認GYP在Windows下生成Visual Studio 2010工程,但是使用2008的同學還是很多的,改變生成工程很簡單。

  1. 使用環境變量,GYP_MSVS_VERSION=2008
  2. 使用命令行參數, -G msvs_version=2008

不過編譯最新的chromium還是使用vs2013

GYP_MSVS_VERSION=2013

set GYP_GENERATORS=msvs,ninja

相關的版本可以填2005, 2008, 2010, 2005e, 2008e等,(支持的版本還是很多的,連express版本都有!)

另外

http://lqhnet.googlecode.com/svn/trunk/gyp.txt

上述網址中講述了很多關於gyp的實用例子,不錯

gyp構建系統介紹 還有下載這個文檔閱讀一下,就能夠書寫一般需求的gyp了。

下面這些是我在使用過程中碰到的一些錯誤,以及解決方案,希望能夠幫到大家

錯誤和解決方案

1、Centos如果運行ninja出錯

解決libc.so.6: version `GLIBC_2.7' not found問題

你可以參考

http://blog.csdn.net/cpplang/article/details/8462768#reply

來升級glibc。

http://hi.baidu.com/756091339/item/83bf19820e5d61e8e596e0b7

上面這個網址解決的問題更多

如果不能成功,好吧,一般都會出現這樣那樣的錯誤,建議還是直接下載ninja的源碼自己來編譯

https://github.com/martine/ninja

下載源碼下來直接run ./bootstrap.py

就可以編譯你需要的ninja可執行文件,加入環境變量,記得刪除之前你沒有成功的ninja環境變量

這樣ninja就可以用了

./ninja -h命令可以獲取幫助

2、

如果運行ninja編譯的時候,比如要生成一個靜態庫,生成。0文件之後發現失敗了,報下面的錯誤

ninja ar: illegal option -- T

那麼uname -r一下看看你的linux內核版本吧。可以升級的話快升級吧,我的直接換了一個3.多的就可以了,2.6的測試不成攻。如果不想升級,看下面更好的解決方案

最新瞭解到

gyp生成的build.ninja文件中有如下

rule alink

command = rm -f $out && $ar rcs $out $in

description = AR $out

rule alink_thin

command = rm -f $out && $ar rcsT $out $in

description = AR $out

當我們生成靜態庫的時候使用ar命令,默認在ninja文件中使用的上面的命令alink_thin而不是alink,區別在於一個是rcs一個是rcsT,這個T參數在我使用的centos低版本內核時候ar -h中根本沒有T這個參數,而ubuntu中有這個參數

 

明確說出這個是壓縮了,都沒有這個命令怎麼可能成功。。我手動改了就行了。再有就是讓ninja如何默認不使用alink_thin還不知道咋搞。待查。

好,我找到了

gyp/gyp/pylib/gyp/generator/ninja.py1122行的alink_thin改成alink就可以了。就是說在linux上不壓縮,直接使用alink即可,關於alinkalink的規則不變,如果改規則就不好了。好開心啊。。。擦

http://git.chromium.org/gitweb/?p=external/gyp.git;a=commitdiff;h=b3e6e5f9ac0c05993c7a38a7ddd68df8a80e6c47

上面的鏈接是說比較了不同之處

3、

Ubuntu下

編譯提示x86_64-linux-gnu文件夾下bits下sched.h啥的

我是把這個文件夾改名了,因爲我在usr/include/bits也有這個文件,我需要的恰恰是後者。之後就好了

後來又提示socket中 __FDELT, __FDMASK

沒有被定義過,查了查,我先裝個glibc試試,沒錯可以啦,哈哈

Ubuntu下安裝glibc   apt-get upgrade glibc

4、

編譯的時候

Threading support unavaliable: it has been explicitly disabled with BOOST_DISABLE_THREADS

Gcc4.7以上會有這種問題

gcc 4.7 + 不能使用boost_thread的解決辦法

在用gcc 4.7及以上的版本gcc編譯boost_thread支持的程序時會提示:

/usr/include/boost/config/requires_threads.hpp:29:4: error: #error "Threading support unavaliable: it has been explicitly disabled with BOOST_DISABLE_THREADS"

這是因爲boost是更具編譯器的宏定義來判斷gcc是否支持多線程,但是gcc 4.7及以上的版本使用的宏與老版本使用的宏不同,這樣,boost自然就不能正確獲取gcc支持多線程的宏,從而導致不能成功編譯boost_thread支持的程序。解決辦法是在/usr/include/boost/config/stdlib/libstdcpp3.hpp文件的:

[cpp] view plaincopy

 

1 #ifdef __GLIBCXX__ // gcc 3.4 and greater:

2 #  if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \

3         || defined(_GLIBCXX__PTHREADS)
改爲:

[cpp] view plaincopy

 

4 #  if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \

5         || defined(_GLIBCXX__PTHREADS) \

6     || defined(_GLIBCXX_HAS_GTHREADS)

最後我是嘗試重新安裝boost解決的,看到他將上面的改成了

#  if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \

|| defined(_GLIBCXX__PTHREADS) \

|| defined(_GLIBCXX_HAS_GTHREADS) \

|| defined(_WIN32) \

|| defined(_AIX)

這樣之後就沒有那種錯誤了,我安裝的是boost155

https://svn.boost.org/trac/boost/ticket/6165,

看這個吧

如果還是不能,那麼就重新安裝一個boost吧

http://blog.chinaunix.net/uid-12226757-id-3427282.html

http://www.open-abc.com/ccode-206.html

5、

如果ninja編譯完了發現庫文件很小,而有確定沒有壓縮,那麼就是沒有寫相應的library,像下面這樣寫上你需要的庫文件

 

而不是下面這樣

 

這樣在libraries裏面不能寫相對路徑;

Ya I stumbled upon this as well, and basically it's a gyp bug where it's not "relativizing" properly.

出自https://github.com/TooTallNate/node-gyp/issues/49

 

我理解爲libraries直接寫-lframecommon,這種即可,可以在lirary_dirs中直接找到,如果你的dirs裏面找不到,就會報錯了,你可以在dirs中寫相對路徑,

'library_dirs':[

'../../framework/framecommon/lib',

],

'libraries':[

'-lframecommon',

#'/home/zhangqinglong/xxxx/3.21/framework/framecommon/lib/libframecommon.a',

],

就想上面的libraries裏面的兩句其實是相等的,都可以完成功能。

另外可以看一下下面這個

https://groups.google.com/forum/#!topic/gyp-developer/bsXV9nA4uyg

好了,下面是我整理的文檔,排版亂,莫怪

GYP筆記

發佈了55 篇原創文章 · 獲贊 19 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章