项目框架设计模式(转)

转自 http://my.huhoo.net/archives/2009/08/post_39.html

项目框架设计模式

目的

  1. 解决多人开发过程中协作的问题;
  2. 解决配置文件规范;
  3. 解决项目源码包和二进制打包的问题;
  4. 解决文档规范;

目录

目的

  1. 解决多人开发过程中协作的问题;
  2. 解决配置文件规范;
  3. 解决项目源码包和二进制打包的问题;
  4. 解决文档规范;

框架

  • 结合git和autoconf,可以达到多人的协作开发模式;

  • 上图中利用autoconf的开发模式,能有效的达到各项的“产出”,具体介绍可浏览autoconf介绍,如果多个人进行开发,可以选择svn或者git,这里有一个大概介绍git的开发模式图:

常约定

  • 在了解大概的模式之后,我们还要了解经常在一些开发和项目中的约定(常约定)。

配置文件

  • 在实际的工程项目中,我们一般使用以下几种类型的配置文件:

    1. unixconfig常用于在unix环境中读取配置信息的一种格式,这种格式被众多开源程序所用,是最广泛的一种配置文件类型;
    2. libconfig是基于自定义的一套数据结构格式,数据结构可以很复杂,也是开源程序经常使用一种方式,最近cnangel做了针对perl读写的模块,这样可以兼容perl语言、C/C++语言;
    3. xml格式是一种常见的数据结构,但也常用于作配置文件,一般在java工程中经常使用,c/c++并不常见;
    4. yaml是一种包含xml等子集的数据格式,在yaml官方网站有yaml的标准规范,且yaml支持多种语言,但是c/c++库提供的库并不是很适合做配置文件,所以此配置类型往往用于脚本;
  • 详细格式见下图:

库公约

  • 针对c/c++开发的项目,我们针对各种平台一般最终需要提供动态链接库和静态链接库;
  • 对于静态库文件,我们常见的Windows平台中一般是.lib为扩展名,类Unix平台中以.a为扩展名,里面相同的都是由一些C或者其他语言生成的object(.o为扩展名)文件打包而成;
  • 对于动态链接库文件,一般在Windows平台中是以.dll作为扩展名,类Unix平台中以.so作为扩展名,里面都是一些符号连接和函数的声明、构造信息等等,一般可以使用工具nm等查看到相关信息,ldd来查看符号连接、依赖等信息;
  • 静态库文件一般比动态连接库大得多,静态库可以解出多个.o结尾的object文件,通过这个方法,我们可以合并很多小的静态库,并合并相应的头文件。静态库的信息相对比较全,主要用来作开发等;
  • 动态库相对来说只有一些符号连接等信息,往往用来支配程序(可执行文件)的运行,而且比静态库会获取到更小的内存空间,从而节省了程序的运行空间;
  • 类Unix动态链接库标准命名规则(soname):
  lib + 链接库名字 + .so + .版本号

每当链接库接口改变时都递增版本号。soname 文件其实只是一个符号链接而已,指向他的real name 文件,更为详细的命令方式如下(real name):

  lib + 链接库名字 + .so + .版本号.次版本号.发行号
  • 实际上,我们连接库时,使用的是如下动态链接库(linker name):
  lib + 链接库名字 + .so

编译器以这个名字来请求指定的链接库。

  • 当程序在内部列出所需要的链接库时,仅仅使用链接库名字。当你创建一个链接库时,使用 real
    name。安装一个新的链接库时,把它复制到一个DLL文件夹里,然后运行程序 ldconfig。ldconfig 检查存在的 real name
    文件,并且创建指向它的符号链接 soname 文件。ldconfig 并重新建立 cache 文件 /etc/ld.so.cache。
  • ldconfig 不会创建 linker name 文件,但是一般性 linker name
    文件在安装链接库的时候创建。linker name 文件也只是一个符号链接,指向最新的 soname 文件或 real name
    文件。建议指向 soname 文件,因为当你更新库以后,在编译器链接的时候,一般总是想使用新的库。
  • 一般而言,链接库必须放置在文件系统的指定位置。
    1. 多数开源软件遵守 GNU 标准:当分发源代码的时候,库默认安装在 /usr/local/lib,命令安装在 /usr/local/bin。该标准还定义了如何重写这些默认标准以及如何调用安装程序。
    2. Filesystem Hierarchy Standard(FHS) 规定:多数库应安装在 /usr/lib,启动时需要的库安装在 /lib,非系统库应安装在 /usr/local/lib
  • GNU 标准是针对开发人员的,FHS 是针对发行者的。
  • 在基于 GNU glibc 的系统上,包括所有 linux 系统,ELF
    可执行二进制文件的运行自动导致程序加载器被加载并且运行。在 linux 下,加载器是
    /lib/ld-linux.so.X(X是版本号)。然后加载器搜索、加载程序所要使用的动态链接库,被搜索的文件夹列表保存在文件
    /etc/ld.so.conf 里。
  • 使用环境变量LD_LIBRARY_PATH, 该变量所指定的文件夹将会首先被搜索,然后才会搜索默认的链接库文件夹。该变量对开发和测试比较有用,但不应该为了给普通用户使用而设置。
  • 在Linux下你可以直接调用程序加载器,比如,你可以传递PATH参数给加载器代替该变量来运行程序:
/lib/ld-linux.so.2 --library-path PATH EXECUTABLE

不带参数执行加载器,可以得到更多帮助。但是,不要这样执行程序,仅供调试时使用。

  • 另外环境变量LD_DEBUG供调试使用的。该变量是dl*函数的开关,用来显示正在做的事情的详细信息。可以取值为:
参数 解释
files 显示so文件的加载顺序
bindings 显示关于符号帮定的信息
libs 显示库搜索路径的信息
versions 显示版本依赖的信息
help 使用该值运行程序将会显示可用的选项
  • 在GNU的编译器中(gcc),很多的编译选项能够很好的辅助我们来创建动态连接库;

    • 用 -fpic 或 -fPIC 选项创建要放入动态链接库中的目标文件。使用该选项生成的代码是位置无关的代码(动态链接库的必要条件)。使用 gcc 的 -Wl 选项传递 soname 参数给链接器。-Wl 选项里不能有未转义的 whitespace。
    • -g 选项使代码包含调试信息,-Wall 选项用来产生警告,两者并不是创建动态链接库必须的,但是建议加上。
    • 不要 strip 所生成的动态链接库,或使用编译器参数 -fomit-frame-pointer,这样做将会无法使用调试器。
    • -fPIC 选项总是可以使用,但生成的代码比使用 -fpic 的要大。-fpic 选项生成的代码比较小、快,但是有平台相关的限制,当创建 DLL 时,链接器将会告诉你是否符合限制。
    • 链接器还有一个有用的选项 -rpath,可以用来指定程序在运行时搜索DLL时的路径,使用 gcc 时可以这样传递参数给链接器:
  -Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)

若使用了这个选项,就可以考虑不用LD_LIBRARY_PATH这个环境变量了。

样例

  • 这里用了一个工程uc作为用例来说明该框架的强大以及灵活多变的可扩展性(目前版本是0.0.2-2版本):
  http://github.com/cnangel/UC/tree/master
时间: 2024-11-03 21:58:42

项目框架设计模式(转)的相关文章

iOS 从零到一搭建组件化项目框架

随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手术的动刀口在哪,就是之前的高度耦合的业务组件和功能组件,手术的目的就是将这些耦合拆分成互相独立的各个组件. 工程效果预览 组件化工程示例项目地址 组件化开源项目Git仓库地址 下面我们围绕这几个问题来展开讲解 为什么要用组件化,它给我们带来哪些优势 各个组件该如何进行拆分,拆分的颗粒度该如何控制 如何从零到一

某智能家居项目框架学习总结

这个月来第一篇博客,各种其他事情.. 之前负责过一个智能家居项目的二次开发,苏州一家公司做的,项目还是分了好几个系统,对业务流程的不同部分进行了划分,我是此项目的主要负责人,通过老师的指导,对这个项目也有了一些了解.此项目运用了一些框架,有些也是我第一次接触到的,下面将对项目用到的一些框架进行总结. 下面可能会出现几个有关智能家居的名词,介绍一下 1.机顶盒:每一个家庭都应该至少有一个机顶盒,控制电器开关都是由机顶盒向各电器的接收器发送命令 2.客户端:也就是用户的移动设备,手机.平板都可以,我

1、Android项目框架搭建 (分析需求、整理资料)

闲来无事.想搭个框架试试 分析一般应用 将资料整理整理 粗略统计 需要以下资料 1.android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.GridView.(Horizontal )ScrollView.Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多.并且他实现的下拉刷新ListView在item不足一屏情况下也

iOS通用的MVC模式项目框架MobileProject

最近项目比较不赶的情况下,决定把一些通用.常用的内容集成在一个项目框架中,意在新项目中可以快速搭建:其实经过几个项目后,总是有一些重复的创建工作,可以使用本项目的内容直接进行开发:采用的是MVC的分层模式,本文将会重点介绍关于层级的划分及一些已经集成的第三方功能介绍:当然本项目的源代码已经上传到gitHub(地址:https://github.com/wujunyang/MobileProject)上面,当然要是对你有帮助记得给个星,假如大家有时间也可以一起完善,或者有什么问题也可以及时留言:

记录-项目java项目框架搭建的一些问题(maven+spring+springmvc+mybatis)

伴随着项目框架的落成后,本以为启动就能成功的,but.... 项目启动开始报错误1:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener 这个错百度到说是缺少这个包,但实际在项目中看到maven里面是有这个包的.于是继续百度到[可能包是找到了,但没有依赖在项目中] 项目右击-----project-----deployment assembly , add ,java bui

[转]MVP+WCF+三层结构搭建项目框架

最近,我一直在重构之前做的一个项目,在这个过程中感慨万千.原先的项目是一个运用了WCF的C/S系统,在客户端运用了MVC模式,但MVC的View.Model耦合以及WCF端分布式欠佳等问题让我有了重构的想法,经过了一段时间的改造,逐渐形成了MVP+三层结构+WCF的面向服务的程序架构.在这里我把我的想法写成了一个例子,供大家参考. 在正式开始讲解之前,我必须得感谢Artech.代震军等诸多大虾,他们的文章给了我很大的启发. 我写的这个例子是关于博客管理的,逻辑很简单,就是用户发表文章.发表评论,

(三) Angular2项目框架搭建心得

前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2.*版本的面目全非,不过宽容点来看这个强大的框架,升级到ng2肯定是一件好事情,虽然截至目前ng2还存在或多或少需要完善的地方,但是ng2做到了留下并强化ng1好的部分,移除或改善其不好的部分,并且基于许多较新Web技术来开发,不去看从ng1迁移到ng2的门槛和工作量的话,ng2的编程体验是很酷炫的. 目前n

android开源项目框架大全:《IT蓝豹》

android开源项目框架大全: 1.多页切换TabHost9 高仿网易云音乐客户端的Home页面切换Tabhost 高仿网易云音乐客户端的Home页面切换Tabhost,并且三角形是透明的,实现方式,自定义AnimTabsView继承 RelativeLayout 里面对当前选中的item 处理 三角形变成透明效果,即在onDraw 里面对三角形图片经行透明度处理,AnimTabsView提供 setOnAnimTabsItemViewChangeListener方法的onChange()用来

七款android地图 [Map] 开源项目框架分类总汇

七款android地图 [Map] 开源项目框架分类总汇: 1.AmapDemo仿照一号专车的地图界面 2.基于高德地图写的不同功能的地图应用 3.基于高德地图的gps.wifi.基站的智能选择定位 4.基于高德SDK搭建的出行类APP,高仿滴滴快的 5.高德地图便民搜索 6.百度地图 7.Android 高德地图gps定位