近期项目中用到了一些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++开发小结相关推荐

  1. 嵌入式Linux驱动开发【学习小结】

    文章目录 前言 一.嵌入式Linux驱动程序和单片机裸奔有啥区别? 二.为什么需要嵌入式Linux驱动开发 三.驱动程序框架大致演变过程 总结 前言 随着去嵌入式设备资源不断丰富,主频不断升高,搭载操 ...

  2. Linux 汇编语言开发指南

    Linux 汇编语言开发指南 肖文鹏 (xiaowp@263.net), 北京理工大学计算机系硕士研究生 本文作者 肖文鹏是北京理工大学计算机系的一名硕士研究生,主要从事操作系统和分布式计算环境的研究 ...

  3. 用 GStreamer 简化 Linux 多媒体开发

    GStreamer 是 GNOME 桌面环境下用来构建流媒体应用的编程框架(framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3.Ogg.MPEG1.MPEG2 ...

  4. linux注入内存泄露,Linux 内存泄露小结

    本文仅限记录自己的一次 内存泄露追踪小记. 可能并不十分适用与大家的情况.而且方法也并不是很smart.仅做记录,能提供个思路更好. 一. 要问调试程序遇到什么问题最头疼, 内存泄露肯定能排在前几名里 ...

  5. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  6. 目录 - 《ARM嵌入式Linux系统开发从入门到精通》 - 免费试读 - book.csdn.net

    第一部分 ARM Linux系统移植 第1章 嵌入式系统开发入门...... 2 1.1 嵌入式系统介绍..... 2 1.1.1 嵌入式系统概述..... 2 1.1.2 嵌入式系统组成..... ...

  7. linux 程序开发

    微信设置水滴昵称,个性中带点萌 前一阵子在QQ上和朋友聊天的时候,总会看到有人说Linux上的应用程序开发是高手才可以完成的,而且这种"迷信"在目前似乎还很普遍.然而,情况并不是这 ...

  8. Linux应用开发入门

     前一阵子在QQ上和朋友聊天的时候,总会看到有人说Linux上的应用程序开发是高手才可以完成的,而且这种"迷信"在目前似乎还很普遍.然而,情况并不是这样的,从程序库的支持方面, ...

  9. Linux驱动开发概述

    第 1 章 Linux驱动开发概述 设备驱动程序是计算机硬件与应用程序的接口,是软件系统与硬件系统沟通的桥梁.如果没有设备驱动程序,那么硬件设备就只是一堆废铁,没有什么功能.本章将对Linux驱动开发 ...

  10. [Linux驱动开发五]实现ioctl函数

    目录 一.前言 1.1 ioctl用来做什么? 1.2 ioctl和unlock_ioctl区别? (1)ioctl()主要用于应用层系统调用 (2)unlock_ioctl主要用于驱动层系统调用 1 ...

最新文章

  1. 标准出现问题,人工智能正在走向错误的方向
  2. OpenCASCADE:使用扩展数据交换 XDE之读写 STEP 或 IGES
  3. cayenne:用于随机模拟的Python包
  4. 日期格式化时注解@DateTimeFormat无效的问题分析
  5. flash动画制作常用代码
  6. [BZOJ]2820: YY的GCD
  7. 6年Python开发,教你一天入门 Python
  8. java的Junit单元测试
  9. 测试所有类型的Class
  10. most_common()函数源码解读
  11. 让电脑前后面板音频插孔同时输出声音方法
  12. 通用电气公司要破产?美国慌不慌?
  13. 蓝桥杯:李白打酒加强版
  14. Cent OS 7 的日常操作
  15. 揭秘跨境电商亚马逊测评的培训骗局!千万不要上当受骗!
  16. 初探Java反序列化漏洞
  17. mysql远程服务器返回错误404_服务器常见页面访问返回错误信息(404 500 400)表示什么意思...
  18. ResNet 残差网络的详细解释
  19. 【已开源】Qt 艾宾浩斯(Ebbinghaus)记忆 软件
  20. 数值分析公式大赏(下)

热门文章

  1. 2021湖南高考成绩分段查询,2021年湖南高考成绩排名查询系统,湖南高考位次排名查询...
  2. axure如何实现跳转_Axure 9 教程:如何做跑马灯广告、弹幕
  3. 基于SSM的车辆管理系统
  4. 设计模式之GOF23原型模式02
  5. CentOS下启动mysql出现“MySQL Daemon failed to start”解决办法
  6. 阿里云Centos6.6安装配置docker
  7. LayaAir 屏幕适配-分辨率、对齐模式
  8. 阶段3 1.Mybatis_09.Mybatis的多表操作_5 完成user的一对多查询操作
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_5_综合案例_文件搜索...
  10. 学习笔记-Rabin-Karp哈希