cpp项目的组织
编译篇
较大型cpp项目的代码组织、编译都是深耦合的。
一般提供一个总体的makefile,进入各个模块,又有自己的makefile,这些makefile又都依赖于一些被include的文件的的定义,为什么要这样原因不必多言。
但要想改变编译环境时,却很难顺利的移植。我们可能踩过的坑有:
1)找不到类库,这个还比较好处理,绝对是你指定的目录问题,甚至是当前目录——一个小圆点不要疏忽了
2)依赖库不匹配,比如glibc、i686、x86_64等,只管去匹配好了
3)还是找不到定义: 注意调整依赖的顺序,一般越是通用、没有耦合的库要尽可能放在后面,让前面找不到定义的库有机会去查找,还有就是双向关联的类——做好声明。
如何定位一些原因,必须学会如下命令:
- ldd -r
- strings | grep [...]
- file 或者 objdump -a
- nm --demangle
- readelf -s [YOURBINNAME]
- objectdump -a *.a
- strings *.so | grep [...]
搞清楚各个库的版本,尤其是libc的
可以用(ldd --version 查看glibc的版本,如ldd (GNU libc) 2.12; 命令/lib64/libc.so.6也可以)
这里再补充些网上找来的资源:
编译源代码时,链接的时候查找顺序是:
(1) -L 指定的路径, 从左到右依次查找
(2) 由环境变量 LIBRARY_PATH 指定的路径,使用":"分割从左到右依次查找
(3) /etc/ld.so.conf 指定的路径顺序
(4) /lib 和 /usr/lib (64位下是/lib64和/usr/lib64)
动态库调用的查找顺序:
(1) ld的-rpath参数指定的路径, 这是写死在代码中的
(2) ld脚本指定的路径
(3) LD_LIBRARY_PATH 指定的路径
(4) /etc/ld.so.conf 指定的路径
(5)/lib和/usr/lib(64位下是/lib64和/usr/lib64)
一般情况链接的时候我们采用-L的方式指定查找路径, 调用动态链接库的时候采用LD_LIBRARY_PATH的方式指定链接路径。
另外注意一个问题,就是只要查找到第一个就会返回,后面的不会再查找.
makefile中对操作系统的判断:
ARCH = $(shell getconf LONG_BIT)
uname -m
ifeq ($(OS_TYPE), x86_64) LIB_EPOLL =
else LIB_EPOLL = -lepoll
endif
待续
cpp项目的组织的更多相关文章
- PBO项目的组织
前言: 最近发现PMI的英文官网已经公布了第五版PMBOK的初稿,针对第四版而言的确有了不少变动.了解这些变动,对理解项目管理知识的整理和发展,以及掌握PMP考试的变化方向都是很重要的.当然,变动尤其 ...
- 161010、在大型项目中组织CSS
编写CSS容易. 编写可维护的CSS难. 这句话你之前可能听过100次了. 原因是CSS中的一切都默认为全局的.如果你是一个C程序员你就知道全局变量不好.如果你是任何一种程序员,你都知道隔离和可组合的 ...
- 160901、在大型项目中组织CSS
编写CSS容易. 编写可维护的CSS难. 这句话你之前可能听过100次了. 原因是CSS中的一切都默认为全局的.如果你是一个C程序员你就知道全局变量不好.如果你是任何一种程序员,你都知道隔离和可组合的 ...
- 拥抱PBO(基于项目的组织)聚焦核心价值创造
近年来.PBO(Project-Based Organizations)作为一种新兴的整合各类专业智力资源和专业知识的组织结构,受到越来越多的关注,第五版PMBOK出现的新词汇.三种组织(职能型.矩阵 ...
- iOS 项目代码组织
参考了很多系列,发现老外们都比较喜欢 group by type,这两个还不错: http://akosma.com/2009/07/28/code-organization-in-xcode-pro ...
- 2019/12/5BJFirstDay--scrum后台+cpp项目前台环境跑起来!!!
1.配置服务器: 2.进入cd C:\java\25.beijing\06.vuejs\cpp201911221829\cpp 3.运行的命令是:npm run dev 4.先启动 5.然后再启动cp ...
- PMP 第二章 项目生命周期与组织
1 项目组织机构类型有哪些? 区别是什么? 职能型 矩阵型 项目性 2 什么是事业环境因素? 什么是组织过程资产? 如何区分事业环境因素和组织过程资产? 事业环境因素:事业环境因素指围绕项目或能影 ...
- 《Visual C++ 2010入门教程》系列五:合理组织项目、使用外部工具让工作更有效
原文:http://www.cnblogs.com/Mrt-02/archive/2011/07/24/2115631.html 这一章跟大家分享一些与c++项目管理.VAX.SVN.VS快捷键等方面 ...
- web手工项目01-系统组织框架-测试流程-需求评审-测试计划与方案
回顾 SVN(定义,作用,使用操作) 软件缺陷(定义,表现形式,原因和根源,基本内容,跟踪流程) JIRA(基本介绍,使用者,工作流,问题,使用) 学习目标 掌握WAMP的环境搭建 掌握熟悉项目的步骤 ...
随机推荐
- 查询java 类加载的路径
在Spring 3.x企业应用开发实战中看到一个能经常用到的jsp,记录下,查看类的加载路径, 在jar包冲突引起的奇葩问题时很好用.使用方法 srcAdd.jsp?className=java.ne ...
- $scope 的生命周期
当Angular关心的事件发生在浏览器中时,比如用户在通过ng-model属性监控的输入字段中输入,或者带有ng-click属性的按钮被点击时,Angular的事件循环都会启动.这个事件将在Angul ...
- 例子:Background Transfer Service Sample
本例演示了如何使用后台传输服务来进行后台文件下载,也就是说及时App已经停止运行,同样可以通过后台代理进行文件的下载操作. 对于后台文件传输一下知识点必须注意: 1. 通过使用 BackgroundT ...
- Xcode 7如何 免费 真机调试iOS应用
运行Xcode后,点击菜单中的Preferences…进入Accounts标签,这里选择添加Apple ID: 在弹出的对话框中登入你的Apple ID,没有的话去注册一个就是了,登录成功后会看到下面 ...
- dos2unix
dos2unix 实际上就是把文本文件里面的^M删除,我一般懒得用这个命令,vi里面用一个命令(:%s/^m//g)删除即可. 用法举例: dos2unix a.txt b.txt 要把一批文件都do ...
- css3的3D和2D
css3的3D旋转:rorateX():参数为正值时,盒子是围绕x轴,完成从Y轴正方向到Y轴负方向的旋转,视觉上呈现高度上的变化.rorateY():参数为正值时,盒子是围绕Y轴,完成从X轴正方向到X ...
- C语言程序设计第八次作业
一.学习内容 本次课学习了一维数组的基本知识,需要大家对如下知识点进行总结: 1. 数组的定义,数组元素的引用,数组的初始化和赋值. 2. 明确以下问题:能否给数组名赋值?为什 ...
- 【RobotFramework自动化测试】数据库值验证
${sqlCount} Row Count ${sqlStr} #注释:Row Count 将SQL查询结果的行数返回给前面的参数: @{rs} query ${sqlS ...
- Cruehead.1
查壳 没有 我拖 alt+F9 到上面 入口处 下断 关键跳 略过 就没了 要实现 强暴 直接过... 仔细来看看... 那两个调用 都下断 看看 判断 ...
- codeforces 732E(贪心)
题目链接:http://codeforces.com/contest/732/problem/E 题意:有n台计算机,m个插座,每台计算机有一个值a[i],每个插座有一个值b[i],每个插座最多只能对 ...