ldd allCamsRawImgsToBev | awk '{print $3}' | xargs -i cp -L {} /work/tool_7vToBew
把自己的算法打包发给别人,部署上线,移植时需要把代码打包成动态链接库或可执行文件。如何打包呢?
话不多说,上例子。
先验证自己的算法和代码是OK的。
编辑test.cpp:
int main( int argc, char** argv) {
Mat src = imread(argv[1]);
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
int Result = ImgCheck(argv[1]);
cout<<"Result: "<<Result<<endl;
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 );
cout<<"算法用时:"<<time_used.count()*1000<<" ms。"<<endl;
return 0;
}
编辑CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(Test)
set( CMAKE_BUILD_TYPE "Release" )
set(CMAKE_CXX_FLAGS "-std=c++11 -O3")
# 寻找OpenCV库
find_package( OpenCV 3 REQUIRED )
# 添加头文件
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_library(ImgCheck SHARED ./ImgCheck.cpp)
link_libraries(ImgCheck)
add_executable(Test test.cpp ${ImgCheck})
target_link_libraries( ImgCheck ${OpenCV_LIBS} )
进行代码编译:
mkdir build
cd build
cmake ..
make
成功后进行测试:
./Test test.jpg
验证OK后开始打包,重新编辑CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(ImgCheck)
set( CMAKE_BUILD_TYPE "Release" )
set(CMAKE_CXX_FLAGS "-std=c++11 -O3")
# 寻找OpenCV库
find_package( OpenCV 3 REQUIRED )
# 添加头文件
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_library(ImgCheck SHARED ./ImgCheck.cpp)
#link_libraries(ImgCheck)
#add_executable(Test test.cpp ${ImgCheck})
target_link_libraries( ImgCheck ${OpenCV_LIBS} )
进行代码编译:
mkdir build
cd build
cmake ..
make
成功后生成了算法动态库libImgCheck.so,将此so和对应ImgCheck.h或README.md发给别人即可。
如果别人没有装OpenCV或其它依赖库怎么办呢?
不要慌,把依赖库一并拷过去即可,这样操作:
首先,查看此算法动态链接库so需要哪些依赖库:
objdump -x libImgCheck.so | grep NEEDED
拷贝第一个依赖库,后三个不需要了:
find -name libopencv_world.so.3.4
cp 路径 本路径
如果移植的环境不同怎么办?别人是ubuntu16.04,你是ubuntu18.04
把后面的几个依赖库都拷贝了,除了libc.so.6,这个一定要慎重拷贝,一般不拷贝。
拷到对方的环境下就OK了吗?NO NO,还要设置软链接哦。
软链接这样设置:
vi ~/.bashrc
export LD_LIBRARY_PATH=/home/imgcheck
source ~/.bashrc
最后唠叨一句,最好要开发环境和部署环境要保持一致,这是合格程序员的自我修养。不然移植中很容易出莫名其妙的问题。