
解决方案:
<article class="baidu_pl" style="box-sizing: inheritoutline: 0pxmargin: 0pxpadding: 16px 0px 0pxdisplay: blockposition: relative">
1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令
ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib .so ), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.
2) 如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:
include ld.so.conf.d/*.conf
**3) 如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下, 但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库. **
LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下, 其中有一大堆库文件在/usr/local/mysql/lib下面, 则可以在.bashrc或.bash_profile或shell里加入以下语句即可:
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
一般来讲这只是一种临时的解决方案, 在没有权限或临时需要的时候使用.
4)如果程序需要的库文件比系统目前存在的村文件版本低,可以做一个链接 比如: error while loading shared libraries: libncurses.so.4: cannot open shared
object file: No such file or directory
ls /usr/lib/libncu*
/usr/lib/libncurses.a /usr/lib/libncurses.so.5
/usr/lib/libncurses.so /usr/lib/libncurses.so.5.3
可见虽然没有libncurses.so.4,但有libncurses.so.5,是可以向下兼容的 建一个链接就好了 ln -s /usr/lib/libncurses.so.5.3 /usr/lib/libncurses.so.4
共享内存相关的API怎么使用不难:1. 首先调用shmget分配一个新的共享内存,这里你可以指定其大小,如果你要分配一个整形,那你可以将size参数设置成4,如果你要共享一个结构体那就将size参数设置成你的结构体大小, *** 作系统不关心你要共享什么,它只关心你要分配多少个字节的区间。而且实际上 *** 作系统会将你要求的大小按照内存页面的大小进行对齐,也就是说它可能实际上给你分配若干个页面的物理存储空间,只要这个空间能够容纳你所指定的大小就ok了。它的第三个参数是关于一些访问权限设置的,要讲起来太长,建议自己搜索一下,或者用man查查帮助。总之,调用完shmget以后系统会给你创建一段共享内存,然后返回给你一个shmid,也就是这个共享内存的标识,你可以理解为给它取了个名字。
2. 接着调用shmat将这段共享内存映射到你的进程的虚拟地址空间上。这个函数的第一个参数就是你之前调用shmget创建的共享内存的名字shmid;第二个参数是个指针,指向你的进程虚存空间中的某个地址,你可以通过传入一个确定的地址强行要求 *** 作系统将共享内存映射到你指定的虚存地址上(可能会失败,如果你指定的虚拟地址空间已经映射了别的物理存储空间),也可以通过传入0地址让系统给你选择一个合适的地址(它会通过返回值把地址返回给你)。第三个参数则允许你指定一些特殊的标志位,还是那句话,太复杂自己搜索一下看看,一般应用不需要用到。
至于例子嘛你可以看看下面这个链接:
http://baike.baidu.com/view/3025906.htm
另外,你要知道只用共享内存是不互斥的,你必须结合信号量一起使用才能防止互斥问题的出现。如果你共享的只是一个整形变量可能问题不大,因为对页面对齐的整形变量的读写都是原子 *** 作,但如果你共享的是个复杂的结构体就得小心了。
在linux下的编程,毫无疑问的迟早都要用到LD_LIBRARY_PATH这个环境变量,不过这个环境变量是基于shell的,也就是说只有在当前设置了的shell里才会有作用,因此每次打开新的shell运行程序不停地设置LD_LIBRARY_PATH,是一件非常麻烦的事情,所以我们就会想有不有什么一劳永逸地方法,使得设置之后就不用再去设置了?答案是肯定的,即在~/目录下打开.bash_profile文件,设置环境变量如下:Java代码
1.LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH
2.export LD_LIBRARY_PATH
LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH 那么以后打开新的shell执行程序是,再也不用每次打开shell就设置LD_LIBRARY_PATH环境变量了。
附:
linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf 或者 使用-R选项)
今天下午尝试使用libosip2,安装比较简单,按照自带的help文档里面的 *** 作进行即可。
$>mkdir linux-build
$>cd linux-build
$>../libosip2-2.2.0/configure
$>make (最后2步要在管理员权限下执行)
# make install
完成之后,会在/usr/local/lib路径下生成一些lioosipXXX.so的文件,在/usr/local/include下生成关于 osip的头文件。
为了测试安装是否正确,在eclipse下建了个测试项目,写了很简单的代码:
#include <sys/time.h>//不加的话,编译时会报错,可能osip依赖于time.h
#include <osip2/osip.h>
//之所以能找到/usr/local/include下关于osip的头文件,是因为eclipse默认把/usr/local/include 放到Include directories里面了。在eclipse的项目属性-->C++ General-->Path and symbols -->Include里面可以看到。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)