运行时动态库 not found。即使在使用-L和-l参数使得成功编译,在运行时仍然可能会找不到库,因为运行时库的搜索路径可能并没有包含-L的目录。
第一种方法:找到缺少的动态库(由于编译和链接时候的使用到了这个动态库,所以很容易找得到),将其加到/lib,/usr/lib中的一个文件夹下,这几个文件夹是系统默认的搜索路径。将库文件放置在其中,运行时就可以搜索到了( /lib /usr/lib )。
第二种方法:设置临时增加链接动态库的路径;export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:[your lib]
第三种方法:/etc/ld.so.cache中缓存了动态库路径,可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径,然后执行ldconfig命令来改变。
第四种方法:在链接时语句后面添加如下命令:-Wl,-rpath=[your lib] 。其中-WI是gcc参数,-rpath是ld参数
优先级:4>2>3>1
补充:
今天遇到一个问题,用g++5.5版本编译不通过,但是用g++4.8版本编译就通过了。调查下来依旧没有答案,猜测是有一些依赖的.so库使用g++4.8版本编译出来的,导致5.5版本下不通过。
为了保险起见,自己编译的库文件最好使用统一的g++版本。
g++和gcc区别
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)
GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C等语言。
gcc和g++的主要区别
1. 对于 *.c和*.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
2. 对于 *.c和*.cpp文件,g++则统一当做cpp文件编译
3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
4. gcc在编译C文件时,可使用的预定义宏是比较少的
5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏。
6.在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个。