Linux C++开发小结
近期项目中用到了一些C++开源库,使用g++编译的时候出现了一些问题,在此做个小结。
项目中用到的库:STL(这个是废话了),occi,log4c,tinyxml
- occi
1. 下载oracle instant client以下3个包: basic.zip, sdk.zip, sqlplus.zip并解压
2. 建立/u01/app/oracle/product/11.1.0/db_1文件夹路径并拷贝上一步解压的文件到此目录下
3. 设置环境变量,编辑.bash_profile,添加以下代码:
export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1
export TNS_ADMIN=$ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=$ORACLE_HOME
export SQLPATH=$ORACLE_HOMEPATH=$PATH:$HOME/bin:$ORACLE_HOME
4. 在$ORACLE_HOME下建立network/admin路径, 并新建tnsnames.ora文件,添加以下代码:
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.1.0/db_1/admin/tnsnames.ora
# Generated by Oracle configuration tools.ORCL =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.16.36.63)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = ORCL)))
5. 在$ORACLE_HOME下建立libclntsh.so.11.1和libocci.so.11.1的软连接
ln -s libclntsh.so.11.1 libclntsh.so
ln -s libocci.so.11.1 libocci.so
6. 修改makefile文件中的include和lib路径,比如:
ORACLE_INCLUDES=-I$(ORACLE_HOME)/sdk/includeINC=$(ORACLE_INCLUDES)ORACLE_LIBS=-L$(ORACLE_HOME)LIB=$(ORACLE_LIBS) -lclntsh -locci
将$(INC)加入到-I参数中,将$(LIB)加入到-L参数中
7. make, done.
- log4c
1. 解压log4c-1.2.1.tar.gz到/usr/local/src目录下
2. 进入log4c-1.2.1目录, 运行./configure --prefix=/usr
3. make & make install
注意:如果不指定安装目录(即默认指向/usr/local),安装完成后需要将/usr/local/lib添加到环境变量LD_LIBRARY_PATH中
- tinyxml
这个是最简单的,解压tinyxml_2_6_1.zip,将tinyxml的六个源文件直接拷贝到工程目录下即可。
这些配置都是在虚拟机Red Hat Enterprise Linux Workstation 6.1下完成的,但到了服务器部署的时候又出现了问题,服务器上仅配置了occi环境,于是正常使用动态链接库的程序在服务器上无法正常编译,提示缺少动态库,当然可以选择在服务器上安装配置log4c环境,但是计算机组的同事显然不情愿这样,这种情况有如下4种解决方案(欢迎补充):
1. 编辑~/.bash_profile或/etc/profile(全局),添加liblog4c.so文件所在路径到LD_LIBRARY_PATH中:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib;export LD_LIBRARY_PATH
2. 编辑/etc/ld.so.conf(适用于除/lib和/usr/lib以外),添加liblog4c.so文件所在路径:
/usr/local/lib
或者bash下直接:
echo "/usr/local/lib" >> /etc/ld.so.conf
运行ldconfig以刷新ld.so.cache(需要root权限)
3. log4c安装后会同时生成liblog4c.a静态库文件,拷贝此文件到工程目录,修改makefile:
# The pre-processor and compiler options.
MY_CFLAGS = -I$(ORACLE_HOME)/rdbms/public \
# -I/usr/include# The linker options.
MY_LIBS = ./liblog4c.a -L$(ORACLE_HOME)/lib \
# -L/usr/lib# The pre-processor options used by the cpp (man cpp for more).
CPPFLAGS = -Wall# The options used in linking as well as in any direct use of ld.
LDFLAGS = -lclntsh -locci \
# -llog4c
ld会将liblog4c.a链接到可执行文件中,生成的可执行文件在删除liblog4c.a的情况下仍可以运行。
4. 链接时加入-R参数(或-rpath)指定运行时动态库位置,拷贝liblog4c.so文件到工程目录,修改makefile:
# The pre-processor and compiler options.
MY_CFLAGS = -I$(ORACLE_HOME)/rdbms/public \
# -I/usr/include# The linker options.
MY_LIBS = -L. -L$(ORACLE_HOME)/lib \
# -L/usr/lib# The pre-processor options used by the cpp (man cpp for more).
CPPFLAGS = -Wall -Wl,-R.:/usr/local/lib
#CPPFLAGS = -Wall -Wl,-rpath=.:/usr/local/lib# The options used in linking as well as in any direct use of ld.
LDFLAGS = -lclntsh -locci \-llog4c
g++编译时可以通过-Wl参数调用链接程序ld,-Wl,表示后面的参数将传给ld,例如:-Wl,-rpath
最后一种方法应该是最好的解决方案,最后总结一下Linux动态链接库的搜索顺序:
1. 链接时指定的搜索路径
2. LD_LIBRARY_PATH环境变量
3. /etc/ld.so.conf中的路径
4. 默认动态库路径/lib
5. 默认动态库路径/usr/lib
转载于:https://www.cnblogs.com/edwardcmh/archive/2012/03/02/2377780.html
Linux C++开发小结相关推荐
- 嵌入式Linux驱动开发【学习小结】
文章目录 前言 一.嵌入式Linux驱动程序和单片机裸奔有啥区别? 二.为什么需要嵌入式Linux驱动开发 三.驱动程序框架大致演变过程 总结 前言 随着去嵌入式设备资源不断丰富,主频不断升高,搭载操 ...
- Linux 汇编语言开发指南
Linux 汇编语言开发指南 肖文鹏 (xiaowp@263.net), 北京理工大学计算机系硕士研究生 本文作者 肖文鹏是北京理工大学计算机系的一名硕士研究生,主要从事操作系统和分布式计算环境的研究 ...
- 用 GStreamer 简化 Linux 多媒体开发
GStreamer 是 GNOME 桌面环境下用来构建流媒体应用的编程框架(framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3.Ogg.MPEG1.MPEG2 ...
- linux注入内存泄露,Linux 内存泄露小结
本文仅限记录自己的一次 内存泄露追踪小记. 可能并不十分适用与大家的情况.而且方法也并不是很smart.仅做记录,能提供个思路更好. 一. 要问调试程序遇到什么问题最头疼, 内存泄露肯定能排在前几名里 ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...
- 目录 - 《ARM嵌入式Linux系统开发从入门到精通》 - 免费试读 - book.csdn.net
第一部分 ARM Linux系统移植 第1章 嵌入式系统开发入门...... 2 1.1 嵌入式系统介绍..... 2 1.1.1 嵌入式系统概述..... 2 1.1.2 嵌入式系统组成..... ...
- linux 程序开发
微信设置水滴昵称,个性中带点萌 前一阵子在QQ上和朋友聊天的时候,总会看到有人说Linux上的应用程序开发是高手才可以完成的,而且这种"迷信"在目前似乎还很普遍.然而,情况并不是这 ...
- Linux应用开发入门
前一阵子在QQ上和朋友聊天的时候,总会看到有人说Linux上的应用程序开发是高手才可以完成的,而且这种"迷信"在目前似乎还很普遍.然而,情况并不是这样的,从程序库的支持方面, ...
- Linux驱动开发概述
第 1 章 Linux驱动开发概述 设备驱动程序是计算机硬件与应用程序的接口,是软件系统与硬件系统沟通的桥梁.如果没有设备驱动程序,那么硬件设备就只是一堆废铁,没有什么功能.本章将对Linux驱动开发 ...
- [Linux驱动开发五]实现ioctl函数
目录 一.前言 1.1 ioctl用来做什么? 1.2 ioctl和unlock_ioctl区别? (1)ioctl()主要用于应用层系统调用 (2)unlock_ioctl主要用于驱动层系统调用 1 ...
最新文章
- 标准出现问题,人工智能正在走向错误的方向
- OpenCASCADE:使用扩展数据交换 XDE之读写 STEP 或 IGES
- cayenne:用于随机模拟的Python包
- 日期格式化时注解@DateTimeFormat无效的问题分析
- flash动画制作常用代码
- [BZOJ]2820: YY的GCD
- 6年Python开发,教你一天入门 Python
- java的Junit单元测试
- 测试所有类型的Class
- most_common()函数源码解读
- 让电脑前后面板音频插孔同时输出声音方法
- 通用电气公司要破产?美国慌不慌?
- 蓝桥杯:李白打酒加强版
- Cent OS 7 的日常操作
- 揭秘跨境电商亚马逊测评的培训骗局!千万不要上当受骗!
- 初探Java反序列化漏洞
- mysql远程服务器返回错误404_服务器常见页面访问返回错误信息(404 500 400)表示什么意思...
- ResNet 残差网络的详细解释
- 【已开源】Qt 艾宾浩斯(Ebbinghaus)记忆 软件
- 数值分析公式大赏(下)
热门文章
- 2021湖南高考成绩分段查询,2021年湖南高考成绩排名查询系统,湖南高考位次排名查询...
- axure如何实现跳转_Axure 9 教程:如何做跑马灯广告、弹幕
- 基于SSM的车辆管理系统
- 设计模式之GOF23原型模式02
- CentOS下启动mysql出现“MySQL Daemon failed to start”解决办法
- 阿里云Centos6.6安装配置docker
- LayaAir 屏幕适配-分辨率、对齐模式
- 阶段3 1.Mybatis_09.Mybatis的多表操作_5 完成user的一对多查询操作
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_5_综合案例_文件搜索...
- 学习笔记-Rabin-Karp哈希