﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客- 驭风万里无垠-随笔分类-Build/Construction</title><link>http://www.cppblog.com/skyscribe/category/11050.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 09 May 2010 17:01:21 GMT</lastBuildDate><pubDate>Sun, 09 May 2010 17:01:21 GMT</pubDate><ttl>60</ttl><item><title>GCC4.5的profile mode</title><link>http://www.cppblog.com/skyscribe/archive/2010/05/09/GCC4_5ProfileMode.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sun, 09 May 2010 07:16:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2010/05/09/GCC4_5ProfileMode.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/114920.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2010/05/09/GCC4_5ProfileMode.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/114920.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/114920.html</trackback:ping><description><![CDATA[GCC最近发布了4.5版本，对于C++的支持除了更为丰富的0x特性支持外（参考<a href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x">这里</a>），<br>还增加了一个新的profile模式（尚处于试验阶段），可以根据程序运行状态给出关于STL使用的一些优化建议。<br><br>参看如下的描述：<br>
<div style="margin-left: 40px;">
<ul>
    <li>
    <p>An experimental <a href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/profile_mode.html">
    profile mode </a> has been added. This is an implementation of
    many C++ standard library constructs with an additional analysis
    layer that gives performance improvement advice based on
    recognition of suboptimal usage patterns. For example,
    </p>
    <pre>#include &lt;vector&gt;<br>int main() <br>{<br>  std::vector&lt;int&gt; v;<br>  for (int k = 0; k &lt; 1024; ++k) <br>    v.insert(v.begin(), k);<br>}<br></pre>
    <p>
    When instrumented via the profile mode, can return suggestions about
    the initial size and choice of the container used as follows:
    </p>
    <pre>vector-to-list: improvement = 5: call stack = 0x804842c ...<br>    : advice = change std::vector to std::list<br>vector-size: improvement = 3: call stack = 0x804842c ...<br>    : advice = change initial container size from 0 to 1024<br></pre>
    <p>
    These constructs can be substituted for the normal libstdc++
    constructs on a piecemeal basis, or all existing components can be
    transformed via the <code>-D_GLIBCXX_PROFILE</code> macro.
    </p>
    </li>
</ul>
</div>
这个profile mode的主要作用就是根据代码实际运行状况给出关于STL的使用优化建议。有点遗憾的是，该profile方法是intrusive的，必须添加-D_GLBCXX_PROFILE来重新编译所有的代码。<br><br>Profile mode的提出源于09年CGO的一篇<a href="http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?reload=true&amp;arnumber=4907670">paper</a>，作者里边出现了华人的名字（根据拼音来判断）;作者地址填的显然是Purdue大学的：<br>&nbsp;&nbsp;&nbsp; Dept. of Comput. Sci., Purdue Univ., West。<br><br>GCC的Profiler对C++的支持一贯停留在和C同样的水平；由于C++模板机制和OO的存在使得很多时候分析profiling结果的意义被大大削弱。<br>这个针对STL的profile mode还是很值得期待的。<br><br><br>  <img src ="http://www.cppblog.com/skyscribe/aggbug/114920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2010-05-09 15:16 <a href="http://www.cppblog.com/skyscribe/archive/2010/05/09/GCC4_5ProfileMode.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost.cmake: 方便解决boost的升级问题</title><link>http://www.cppblog.com/skyscribe/archive/2010/05/09/114919.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sun, 09 May 2010 06:59:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2010/05/09/114919.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/114919.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2010/05/09/114919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/114919.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/114919.html</trackback:ping><description><![CDATA[以前常用boost的一些库，由于项目自身用cmake组织build。<br>boost每次升级之后，重新用bjam编译一次都很是不便（某些平台，用默认选项编译有些问题，基本安装不成功）。<br><br>最近才发现boost的cmake版本已经独立出来了，对于使用cmake的用户而言，这里是个不错的选择。<br>项目<a  href="http://sodium.resophonic.com/boost-cmake/current-docs/">主页</a>的文档很是清晰，最新的版本是1.41 (版本号对应的基本就是其upstream的boost版本号)。<br>源代码是用git组织的，对于Linux用户而言更加方便。<br><br>引用其主页上的一句话：<br>
<div style="margin-left: 40px;">Boost.<a class="reference external" href="http://www.cmake.org/">CMake</a>
(or <a class="reference internal" href="http://sodium.resophonic.com/boost-cmake/current-docs/#alt-boost"><em> alt.boost</em> </a>)
is the boost distribution that all the cool kids are
using.
</div>
<br>CMake + <a  href="http://gitorious.org/boost/cmake.git">GIT</a> +<a  href="http://sphinx.pocoo.org/">Spinx</a> 确实够酷了。<br><br><span style="font-family: 微软雅黑;">编译起来可以充分利用强大的CMake了：</span><br>
<div style="margin-left: 40px;">
<pre>git clone git://gitorious.org/boost/cmake.git src<br>cd src<br>git checkout &lt;TAG&gt; &nbsp; &nbsp;//TAG==1.41.0.cmake0<br>mkdir bld<br>cd bld/<br>cmake ../<br></pre>
</div>
<pre>如果需要按需编译某些库，只需用make edit_cache修改cache即可。<br></pre>
<div style="margin-left: 40px;">
</div><img src ="http://www.cppblog.com/skyscribe/aggbug/114919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2010-05-09 14:59 <a href="http://www.cppblog.com/skyscribe/archive/2010/05/09/114919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CMake杂记</title><link>http://www.cppblog.com/skyscribe/archive/2009/07/04/89219.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sat, 04 Jul 2009 05:15:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/07/04/89219.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/89219.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/07/04/89219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/89219.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/89219.html</trackback:ping><description><![CDATA[<ul>
</ul>
<ul>
    <li>1&gt; 尽量使用外部build而不是内部build.</li>
</ul>
<ul>
</ul>
<div style="margin-left: 40px;">所谓的内外，指的是make目录和CMakeLists.txt不在一个目录下。<br>好处是，所有的临时文件都会生成在当前运行cmake/make的目录。<br>譬如在项目根目录有一个CMakeLists.txt作为top-level file, 几个代码子目录，一个build目录，可以用：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">cd&nbsp;build<br>cmake&nbsp;..<br>make</span></div>
此时中间文件不会污染项目的目录结构。<br></div>
<ul>
</ul>
<ul>
    <li>2&gt; 可以用如下方式生成同名的静态库和动态库：</li>
</ul>
<ul>
</ul>
<div style="margin-left: 40px;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">set</span><span style="color: #000000;">(libname&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">mylib</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br><img src="http://www.cppblog.com/Images/dot.gif"><br>add_library(libname_static&nbsp;STATIC&nbsp;src1&nbsp;src2)<br>set_target_properties(libname_static&nbsp;OUTPUT_NAME&nbsp;${libname})<br><br>add_library(libname&nbsp;SHARED&nbsp;src1&nbsp;src2)<br></span></div>
</div>
<ul>
    <li>3&gt; 如何获取当前运行目录（working directory）:可以在根目录设置一个project_dir变量，设置为源代码目录，如下</li>
</ul>
<div style="margin-left: 40px;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">set</span><span style="color: #000000;">(project_top_dir&nbsp;${CMAKE_CURRENT_SOURCE_DIR}</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;"><br></span><span style="color: #000000;"><br>add_subdirectory(sub1)<br>add_subdirectory(sub2)<br></span></div>
此时，各个子目录中可以应用project_top_dir.<br></div>
4&gt; 处理跨平台的第三方库：假设第三方库不是由CMake编译得来，但要检测依赖和变动，则可以用imported属性：<br>
<div style="margin-left: 40px;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">add_library(ssllib&nbsp;SHARED&nbsp;IMPORTED)<br>add_library(cryptolib&nbsp;SHARED&nbsp;IMPORTED)<br>#May&nbsp;have&nbsp;different&nbsp;dependent&nbsp;libraries<br></span><span style="color: #0000ff;">set</span><span style="color: #000000;">(libsuffix&nbsp;${CMAKE_SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR})<br>set_target_properties(ssllib&nbsp;PROPERTIES&nbsp;IMPORTED_LOCATION&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">${project_top_dir}contrib/openssl/lib/libssl-${libsuffix}.so</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>set_target_properties(cryptolib&nbsp;PROPERTIES&nbsp;IMPORTED_LOCATION&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">${project_top_dir}contrib/openssl/lib/libcrypto-${libsuffix}.so</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br><br><br>........................<br>#other CMakeLists.txt<br>add_executable(myExe src1 src2)<br>target_link_libraries(myExe ssllib cryptolib)<br></span></div>
</div><img src ="http://www.cppblog.com/skyscribe/aggbug/89219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-07-04 13:15 <a href="http://www.cppblog.com/skyscribe/archive/2009/07/04/89219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用cmake来搭建开发环境</title><link>http://www.cppblog.com/skyscribe/archive/2009/07/01/89026.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Wed, 01 Jul 2009 13:51:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/07/01/89026.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/89026.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/07/01/89026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/89026.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/89026.html</trackback:ping><description><![CDATA[对于经常在终端下写程序的non-windows程序员，Makefile绝对是最常用的工具，小到一个文件的简单的测试程序，大到数百个文件的商业软件，只需要有shell，一个make命令就可得到可运行的程序，Makefile绝对功不可没；可惜世界中不是那么太平，不但各个Posix系统的API千差万别，硬件平台各异，就连Makefile本身也有多个不兼容的格式，譬如GNU Makefile 拿到Solaris平台上就没法make下去，除非你有gmake，但gmake对并行编译的支持就没有solaris自带的dmake要好了。<br><br>GNU autotools提供了一个不错的选择，可以做到组织工具链来生成所需的Makefile，但缺陷是学习起来比较麻烦，而且模版文件写起来比较费劲。老实说我跟Makefile打了近3年的交道，几乎没有自己写过automake脚本，相反的工作倒是干了不少，譬如分析生成的Makefile运行过程，然后模拟自己手写Makefile；得到一个轻爽的定制环境。<br><br>除了autotools，其实也有不少其他的工具，譬如apache的ant，基于Python的scons；ant在java界是鼎鼎大名了，可惜对c++的支持确实让我感觉很不习惯；scons号称可以嵌入Python代码，用起来也算简单，但是想实现复杂的功能就很头疼了，而且运行速度让人挠头。<br><br>cmake则弥补了上述几个工具的诸多缺陷：<br>1&gt; 易于学习，文档易懂，只需牢记以下两个命令即可：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help<br>cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help</span><span style="color: #000000;">-</span><span style="color: #000000;">command</span><span style="color: #000000;">-</span><span style="color: #000000;">list<br>cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help</span><span style="color: #000000;">-</span><span style="color: #000000;">command&nbsp;xxx<br>cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help</span><span style="color: #000000;">-</span><span style="color: #000000;">variable</span><span style="color: #000000;">-</span><span style="color: #000000;">list<br>cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help</span><span style="color: #000000;">-</span><span style="color: #000000;">variable&nbsp;yyy</span></div>
2&gt; 以文本文件组织，利用cache的方式，所有的自定义cache变量可直接用vim查看。<br>3&gt; 生成的Makefile文件简洁易懂<br>4&gt; 编译器选项可自己在ccmake中编辑，利于交叉编译<br>5&gt; 支持集成ctest/cpack,前者可以方便的做单元测试，后者则可以打包生成tgz/rpm<br>6&gt; 支持多个生成器，可以生成eclipse/codeblocks/gmake/unix make文件，甚至可以生成VC各个版本的dsw/sln.<br>7&gt; 内嵌语言，可以自己写函数、宏等<br><br>对于经常写小测试程序的人来说，在test目录下加上个CMakeLists.txt，里边加上几行简单的语句就可以方便的以后重复使用了。对于这种情况，手工写的Makefile碰到依赖检测这种麻烦的事情往往力不从心，automake又太小题大作，而cmake则恰到好处了。<br><br>对于大型程序，cmake可以自己定制生成的中间文件和目标文件路径，有效避免了automake带来的每个目录下生成一大堆文件的弊端，也不需要手工写Makefile。<br>最有用的是可以生成多个知名IDE的工程文件，包括Windows下的vc6-vc9.<br><br><img src ="http://www.cppblog.com/skyscribe/aggbug/89026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-07-01 21:51 <a href="http://www.cppblog.com/skyscribe/archive/2009/07/01/89026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>