• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Clear

            記憶中的閃光,總會蒙塵。
            隨筆 - 6, 文章 - 0, 評論 - 0, 引用 - 0
            數據加載中……

            2012年11月15日

            讓Premake4支持protobuf的protoc生成源文件

            最近在使用Premake4進行項目配置生成makefile之類。

            比較而言,Premake4比cmake還是感覺簡單一點,至少lua語法簡單,premake4的配置文件比較簡單易讀,而cmake的配置文件就比較復雜,而且又是自己定義的一套東西,用起來實在比較煩。

            Premake4還有一個比較好用的特性,可以直接用 **/*.cpp 指定項目包含所有目錄下的cpp文件,而不用單個指定。這樣每次增加一個文件不用老等編譯了才想起來忘記了增加文件到配置中。算是給懶人的一個福利吧。

            當然,Premake4也有自己的缺陷,目前還不支持自定義規則,所以如果項目中有用到什么自動生成源文件的特性就比較麻煩了,比如這次說到的protobuf要用protoc編譯.proto文件生成.pb.cc和.pb.h文件,另外QT也有類似的需求,就我之前某項目中,也使用了tolua++生成過c++的lua接口文件。

            但是,Premake4雖然還不支持自定義規則,但是總算有一個prebuildcommands可以用,于是研究了一下,自制了一個.proto文件的"編譯規則":

            function protobufs(pat)
            local list = {}
            if type(pat) == "string" then
            list[1] = pat;
            elseif type(pat) == "table" then
            list = pat;
            end
            local proj = project();
            for _,pat in ipairs(list) do
            local protofiles = os.matchfiles(pat);
            for _,protofile in ipairs(protofiles) do
            local basename = path.getbasename(protofile);
            local sourcedir = proj.basedir.."/"..path.getdirectory(protofile);
            local sourcefile = proj.basedir.."/"..protofile;
            local targetdir = "$(OBJDIR)/proto/"..path.getdirectory(protofile);
            local targetfile = targetdir.."/"..basename..".pb.cc";
            prebuildcommands {
            "@mkdir -p "..targetdir,
            "@test "..sourcefile.." \\\n"
            .."\t\t\t -ot "..targetfile.." || \\\n"
            .."\t\t( echo protoc "..protofile.." && \\\n"
            .."\t\tprotoc --cpp_out "..targetdir.."\\\n"
            .."\t\t\t"..sourcefile.."\\\n"
            .."\t\t\t".." -I"..sourcedir.." ) \\\n"
            }
            files {
            path.join(targetdir, basename..".pb.h"),
            path.join(targetdir, basename..".pb.cc"),
            }
            includedirs { targetdir }
            end
            end
            end

            使用方法呢,就是把上面的代碼保存到protobuf.lua里面,然后在premake4.lua最開始的時候,調用

            dofile "protobuf.lua"

            然后在項目定義的時候,使用

            protobufs { "**/*.proto" }

            就可以了。

            ?

            當然,還有一點要注意的,我的系統是mac,但腳本在linux下應該也能同樣運行,但是windows下面的話,可能就需要做一點改動了。

            posted @ 2012-11-15 22:44 Clear 閱讀(1381) | 評論 (0)編輯 收藏

            2012年11月11日

            MacVim中Pyclewn的配置

            換到Mac下面,MacVim自然裝上了。

            要想調試程序,直接gdb倒也可以,不過就是找代碼很費力,這就要看Pyclewn了。

            下載,安裝,一切似乎都正常。

            可是啟動pyclewn以后,發現gdb的命令沒有輸出到buffer?怎么搞?

            原來pyclewn用的還是系統自帶的gdb,暈,版本好老了。

            在.vimrc里面加上

            set pyclewn_args='-p ggdb'

            指定使用macports的gdb,這就行了。

            ps.

            MacVim 的snapshot 64版本的balloon顯示不出來,不知道怎么回事。

            升級到snapshot 65就ok了。

            posted @ 2012-11-11 17:38 Clear 閱讀(613) | 評論 (0)編輯 收藏

            2012年10月28日

            GDB在Mac下的調試信息

            上次說了GDB的pretty printer,這次來說說調試程序的問題。

            在Linux或者Windows下面,寫好代碼,g++編譯,連接,調試,一切很順暢。

            但是在Mac下面,有點小問題。

            我們如果是直接編譯生成可執行文件:

            g++ test.cpp -g -o test

            ok,我們用GDB調試,沒有問題。
            但是如果我們分兩步,編譯和連接分開的話:

            g++ test.cpp -g -c -o test.o
            g++ -o test test.o

            這次我們gdb test再調試,會發現GDB找不到調試符號信息!

            兩次生成有什么不同呢?
            一次編譯生成的test,旁邊有一個test.dSYM,而單獨連接的test,沒有這個。

            test.dSYM就是調試符號信息。
            要想生成這個東西,也簡單,運行dsymutil就可以了:?

            dsymutil test

            再然后,就可以用GDB順利調試了。

            g++直接生成可執行文件的時候,會幫我們調用一次dsymutil,但是單獨連接的時候卻不會做這個,這就是造成差別的原因。

            posted @ 2012-10-28 23:47 Clear 閱讀(869) | 評論 (0)編輯 收藏

            2012年9月24日

            Mac 下使用GDB的pretty printer

            GDB 從7.x版本開始就支持pretty printer

            可是一直以來都沒有見到這個東西起作用,最近就研究了一下。

            我的環境是Mac Mountain Lion + macports,GCC 4.7,GDB 7.5

            首先,按照

            http://sourceware.org/gdb/wiki/STLSupport

            下載checkout STL的pretty printer。

            設置好.gdbinit以后,運行告知已經注冊,不能重復注冊。

            $locate printers.py

            發現在/opt/local/share/gcc-4.7/gcc-4.7.1/python/libstdcxx/v6已經有一份現成的了。

            好吧,我們就使用現有的好了。

            寫個程序,調試,print,怎么回事?還是不成?

            頭暈了好久,好在python的源碼是可以隨便看隨便改的,于是在printers.py里面改來改去,調試了半天,發現:

            這個printers.py注冊了好多stl類型的printer,打印出來有以下這些:

            std::__cxx1998::__7::unordered_multiset

            std::tr1::unordered_multiset

            std::unordered_set

            std::tr1::unordered_multimap

            std::tr1::__7::weak_ptr

            std::__7::bitset

            std::__cxx1998::multiset

            std::bitset

            std::forward_list

            std::__7::forward_list

            std::__cxx1998::forward_list

            std::__7::_Rb_tree_iterator

            std::__7::list

            std::__debug::unordered_multimap

            __gnu_cxx::slist

            std::__7::priority_queue

            std::__debug::map

            std::_List_const_iterator

            std::__debug::unordered_map

            __gnu_cxx::_Slist_iterator

            std::set

            std::__cxx1998::__7::_Deque_const_iterator

            std::__7::_List_const_iterator

            std::__7::multiset

            std::shared_ptr

            std::__7::queue

            std::__cxx1998::_List_iterator

            std::tr1::unordered_map

            std::__7::vector

            std::__debug::queue

            std::__norm::_Deque_const_iterator

            std::__7::unordered_set

            std::__norm::_Deque_iterator

            std::__cxx1998::_Deque_iterator

            __gnu_cxx::__7::_Slist_iterator

            std::__cxx1998::list

            std::__cxx1998::__7::list

            std::unordered_multimap

            std::__cxx1998::unordered_multiset

            std::__cxx1998::__7::_List_iterator

            std::__7::map

            std::__debug::vector

            std::tr1::__7::unordered_set

            std::__7::basic_string

            std::weak_ptr

            std::__7::set

            std::__7::unordered_multiset

            __gnu_cxx::__7::__normal_iterator

            std::__cxx1998::__7::vector

            std::unordered_map

            std::list

            std::tr1::__7::unordered_map

            std::__7::unordered_multimap

            std::vector

            std::tr1::unordered_set

            std::_List_iterator

            std::__7::_Deque_iterator

            std::__cxx1998::map

            std::__cxx1998::bitset

            std::__7::weak_ptr

            std::__cxx1998::vector

            std::__cxx1998::unordered_set

            std::priority_queue

            __gnu_cxx::__7::slist

            std::__7::_Rb_tree_const_iterator

            std::_Deque_const_iterator

            std::__7::deque

            std::__cxx1998::set

            std::__cxx1998::__7::bitset

            __gnu_debug::_Safe_iterator

            std::tr1::__7::unordered_multimap

            __gnu_cxx::__normal_iterator

            std::__cxx1998::__7::multiset

            std::__cxx1998::__7::unordered_map

            std::__debug::unique_ptr

            std::__cxx1998::_List_const_iterator

            std::_Deque_iterator

            std::tr1::__7::unordered_multiset

            std::unordered_multiset

            std::__cxx1998::__7::unordered_multimap

            std::__debug::multiset

            std::tr1::weak_ptr

            std::__cxx1998::_Deque_const_iterator

            std::__cxx1998::unordered_map

            std::__7::unique_ptr

            std::__debug::list

            std::__debug::unordered_multiset

            std::__cxx1998::deque

            std::_Rb_tree_const_iterator

            std::__debug::bitset

            std::queue

            std::tr1::__7::shared_ptr

            std::__debug::unordered_set

            std::tr1::shared_ptr

            std::__cxx1998::__7::_List_const_iterator

            std::__cxx1998::__7::_Deque_iterator

            std::__cxx1998::__7::map

            std::__7::stack

            std::unique_ptr

            std::__cxx1998::__7::deque

            std::map

            std::__7::multimap

            std::stack

            std::__debug::stack

            std::_Rb_tree_iterator

            std::multimap

            std::__norm::_List_const_iterator

            std::__debug::multimap

            std::__norm::_List_iterator

            std::deque

            std::tuple

            std::__cxx1998::unordered_multimap

            std::basic_string

            std::__7::tuple

            std::__debug::deque

            std::__debug::priority_queue

            std::__7::_Deque_const_iterator

            std::__7::shared_ptr

            std::__cxx1998::__7::multimap

            std::__debug::forward_list

            std::__7::unordered_map

            std::__debug::set

            std::__cxx1998::__7::unordered_set

            std::__cxx1998::__7::set

            std::__7::_List_iterator

            std::__cxx1998::multimap

            std::__cxx1998::__7::forward_list

            std::multiset:

            然后,我們的一個簡單的string類型,傳入到python的lookup里面查找,找不到?

            最后發現,string類型傳入python以后的basename是basic_string,沒有前面的namespace!

            于是,在Printer類的add_version函數里面,增加一行

            self.add(name, function)

            保存,重新打開GDB,調試程序,OK了:

            (gdb) p s

            $1 = "great"

            (gdb) p v

            $2 = vector of length 5, capacity 8 = {"a1", "a2", "a2", "a3", "a4"}

            posted @ 2012-09-24 23:15 Clear 閱讀(1723) | 評論 (0)編輯 收藏

            2009年9月27日

            CoLinux的網絡配置

                 摘要: 昨天的說到配置CoLinux在Windows下面啟動另一個分區里面的Linux,但是網絡配置只是使用了最簡單的slirp模式。

            CoLinux的網絡配置共有3種:

            slirp:最簡單的模式,CoLinux內可通過Windows系統訪問網絡,但外部不能直接訪問Linux,如果需要訪問,需要做端口映射。
            tuntap:在Windows中虛擬一塊網卡,Linux與Windows通過該網卡通訊,Linux不能直接訪問外部網絡,必須在Windows上配置路由和NAT,或者簡單使用Windows的Internet連接共享ICS。
            pcap-bridge:必須有一塊連接網絡的網卡才能使用,另外需要安裝WinPCap軟件。該模式將一塊實際網卡模擬出另一塊網卡并連接到網絡,對外部看來,就好像實際上有兩臺不同機器一樣。
            ndis-bridge:與pcap-bridge模式一樣,不過不使用WinPCap軟件接口而是通過Windows的NDIS接口層模擬網卡。  閱讀全文

            posted @ 2009-09-27 22:29 Clear 閱讀(4602) | 評論 (0)編輯 收藏

            Windows和Linux雙啟動,并用在Windows下配置CoLinux啟動

                 摘要: Windows和Linux都是好東西,配置雙啟動不難,但是有時候在Windows下面想要臨時換到Linux,總是麻煩。

            以前都是用VmWare,配置使用實際硬盤,然后再Windows里面進行啟動另一個分區里面的Linux然后操作。

            不過這樣實在是麻煩,而且VmWare占用資源也是在太大,如果配置512內存,就要在系統里面直接占用掉512M內存,即使實際上Linux根本不用那么多。

            不過,前段時間發現了CoLinux這個好東西,可以把Linux內核作為Windows的本地進程運行,不錯不錯。
              閱讀全文

            posted @ 2009-09-27 01:11 Clear 閱讀(1947) | 評論 (0)編輯 收藏

            丁香五月网久久综合| 人妻久久久一区二区三区| 久久久久无码国产精品不卡| 色综合久久最新中文字幕| 国产香蕉97碰碰久久人人| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久综合九色综合久99| 精品久久久久久中文字幕大豆网 | 久久国产福利免费| 久久无码AV一区二区三区| 久久久久久亚洲AV无码专区| 国产精品久久久福利| 综合久久精品色| 色婷婷综合久久久久中文一区二区| 久久国产亚洲精品麻豆| 国产欧美久久久精品影院| 久久综合狠狠综合久久激情 | 伊色综合久久之综合久久| 91精品国产91久久| 潮喷大喷水系列无码久久精品| 中文成人久久久久影院免费观看| 99久久精品国产麻豆| 欧美亚洲国产精品久久久久| 2021国产成人精品久久| 久久狠狠高潮亚洲精品| 久久人做人爽一区二区三区| 国产成人AV综合久久| 成人妇女免费播放久久久| 久久久久久伊人高潮影院| 久久婷婷五月综合成人D啪| 国产精品熟女福利久久AV| 久久99国产精品久久99果冻传媒| 久久天天躁狠狠躁夜夜avapp | 日韩久久无码免费毛片软件| 国产成人久久777777| 99久久综合狠狠综合久久| 久久香蕉国产线看观看99| 午夜不卡888久久| 国产成人AV综合久久| 色婷婷综合久久久久中文字幕| 国产一区二区精品久久凹凸|