原文:木木老蔫 | http://www.akmumu.com/2014/04/10/265/.html
GYP是什麼
GYP是Generate 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的同學還是很多的,改變生成工程很簡單。
- 使用環境變量,
GYP_MSVS_VERSION=2008
- 使用命令行參數,
-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.py的1122行的alink_thin改成alink就可以了。就是說在linux上不壓縮,直接使用alink即可,關於alink和alink的規則不變,如果改規則就不好了。好開心啊。。。擦
上面的鏈接是說比較了不同之處
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
好了,下面是我整理的文檔,排版亂,莫怪