可执行文件的简单移植
1. 环境变量
PATH
保存了可直接在shell下运行的所有命令所在的路径,一般为多个路径。如想在命令行下直接运行python命令,可通过以下语句。
export PATH=/path/to/python:$PATH
LIBRARY_PATH
用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。
LD_LIBRARY_PATH
用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。
export LIBRARY_PATH=dir1:dir2:$LIBRARY_PATH
export LD_LIBRARY_PATH=dir1:dir2:dir3:$LD_LIBRARY_PATH
可通过以下语句查看环境变量
echo $LD_LIBRARY_PATH
echo $PATH
echo $LIBRARY_PATH
结果示例

2.GCC版本不同导致的问题
在Linux下使用make编译时,如编译得到链接Opencv库的gcc/g++版本与当前make中使用的gcc/g++版本不同,则会报错。
如链接用gcc5.5.0编译的Opencv到工程,使用gcc4.8.5版本make,报错如下:

解决方法
升级gcc/g++版本与编译opencv库时使用的gcc/g++版本相同;
3.可执行程序移植
目的
将可执行程序M从服务器A编译完毕,复制到服务器B上运行。
问题
如B和A的环境不完全相同,导致M所需加载的库在B上无法找到或版本不匹配或编译方式不对应,则会报错。
例子
如因为opencv版本不匹配或编译opencv的gcc版本不匹配导致的错误
undefined symbol: _ZN2cv17CascadeClassifier4loadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
解决方法
ldd DEMO_EXE #在服务器A上查看DEMO_EXE程序链接的库,如.so
排除Linux系统自带的so库,将其余链接的.so文件拷贝到服务器的固定文件夹下/path/to/soDir,将该路径添加到LD_LIBRARY_PATH中;
export LD_LIBRARY_PATH=/path/to/soDir:$LD_LIBRARY_PATH #保留之前LD_LIBRARY_PATH下的其他库
export LD_LIBRARY_PATH=/path/to/soDir #去除之前lD_LIBRARY_PATH下的所有库,只加载/path/to/soDir目录下的库;此种方法可有效解决服务器上多个opencv版本共存混合调用的问题
由此,在服务器A上编译的可执行文件,即可在服务器B上以无源码+链接库形式下成功执行。
参考链接
浙公网安备 33010602011771号