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的环境搭建 掌握熟悉项目的步骤 ...
随机推荐
- hudson slave搭建
Hudson Slave搭建 使用Hudson搭建分布式的构建环境非常方便,客户端也不需要太多的操作,只要能执行java命令就行. hudson默认采用master方式进行安装,master作为 ...
- JDBC代码示例
package test; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;imp ...
- cookie 保存上次访问url方法
if (Session[Enums.UserInfoSeesion] == null) { HttpCookie cookie = Request.Cookies[Enums.UserLastAcce ...
- SparkMLlib之 logistic regression源码分析
最近在研究机器学习,使用的工具是spark,本文是针对spar最新的源码Spark1.6.0的MLlib中的logistic regression, linear regression进行源码分析,其 ...
- iOS开发:保持程序在后台长时间运行
iOS开发:保持程序在后台长时间运行 2014 年 5 月 26 日 / NIVALXER / 0 COMMENTS iOS为了让设备尽量省电,减少不必要的开销,保持系统流畅,因而对后台机制采用墓碑式 ...
- Spring事务配置的五种方式(转载)
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...
- C# DataGridView使用记录分享
最近使用DataGridView,把其中遇到的问题和一些知识记录下来,以便以后用到的时候可以快速的想起. 1.添加行号 有时我们在使用DataGridView时会被要求添加在每一行数据前面添加上行号, ...
- [Linux学习]Shell脚本(1)--函数,输入,if判断(持续更新)+删除空行 +保存当前路径
1)接收输入 check_status() { echo --Check hi_repo status is ok? y or n read var if [ "$var" != ...
- centos系列——1
今天开始好好学一下centos,下面记录全过程,以方便后来查阅. 开机后用户名为root. 忘记密码修改方法: 以GRUB 多系统引导程序启动,用GRUB引导系统进入单用户步骤:(1) 启动GRUB, ...
- NYOJY 491 幸运三角形
描述 话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同 ...