无需重新编译,如何在其他Linux机器部署已编译的OpenCV3.1?
这个问题我在部署OpenCV的时候碰到过好多次,直接复制编译后的文件确实会让find_package(OpenCV)找不到库——因为CMake需要特定的配置文件来定位OpenCV的头文件、库和依赖,而这些文件不会自动被系统识别。下面是一步步的解决方法:
1. 确保复制的OpenCV文件完整
首先,你需要复制完整的OpenCV安装目录(优先选make install后的目录,而非编译时的临时build目录):
- 如果编译时你指定了自定义安装路径(比如
cmake -DCMAKE_INSTALL_PREFIX=~/opencv3_install ..),就把~/opencv3_install整个目录复制到目标机器的任意路径(比如同样的~/opencv3_install,或者自定义路径)。 - 如果是默认安装到
/usr/local,那需要复制/usr/local/include/opencv2、/usr/local/lib里的OpenCV相关文件,以及/usr/local/share/OpenCV目录(这里存着关键的OpenCVConfig.cmake)。不过更稳妥的是直接复制整个/usr/local下的OpenCV相关内容,或者用自定义安装路径避免干扰系统文件。
2. 让CMake能找到OpenCV的配置文件
find_package(OpenCV)本质是找OpenCVConfig.cmake文件,你有三种方式告诉CMake它的位置:
方式一:设置环境变量(临时生效)
在目标机器的终端里执行:
# 替换成你复制的OpenCV安装目录下的share/OpenCV路径 export OpenCV_DIR=/path/to/your/copied/opencv_install/share/OpenCV
如果是复制的编译build目录(没执行install),路径就是/path/to/your/copied/opencv_build(build目录里直接有OpenCVConfig.cmake)。
方式二:在CMakeLists.txt里硬编码路径(永久生效)
在find_package(OpenCV)之前添加一行:
# 替换成你的实际路径 set(OpenCV_DIR "/path/to/your/copied/opencv_install/share/OpenCV") find_package(OpenCV REQUIRED)
这种方式不需要用户设置环境变量,适合固定部署路径的场景。
方式三:添加到CMAKE_PREFIX_PATH(全局生效)
把OpenCV的安装目录加到CMAKE_PREFIX_PATH环境变量里,这样所有CMake项目都会自动搜索这个路径:
export CMAKE_PREFIX_PATH=/path/to/your/copied/opencv_install:$CMAKE_PREFIX_PATH
如果想永久生效,可以把这行加到~/.bashrc或者/etc/profile里。
3. 检查并安装依赖库
复制过去的OpenCV库可能依赖目标机器上没有的系统库,运行程序前可以先检查:
# 替换成你复制的OpenCV库文件路径,比如libopencv_core.so.3.1 ldd /path/to/opencv_install/lib/libopencv_core.so.3.1
如果输出里有not found的库,用apt安装对应的包即可,比如缺失libgtk-3.so就执行sudo apt install libgtk-3-dev。
4. 验证部署是否成功
写个简单的测试程序验证:
test.cpp
#include <opencv2/opencv.hpp> #include <iostream> int main() { cv::Mat test_img = cv::Mat::zeros(100, 100, CV_8UC3); std::cout << "OpenCV version: " << CV_VERSION << std::endl; return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(opencv_test) # 如果用方式二,这里添加set(OpenCV_DIR ...) find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(test_opencv test.cpp) target_link_libraries(test_opencv ${OpenCV_LIBS})
然后编译运行:
mkdir build && cd build cmake .. make ./test_opencv
如果能输出OpenCV version: 3.1.0,说明部署成功了。
常见坑提醒
- 尽量让两台Ubuntu版本接近,否则系统库版本差异可能导致运行时崩溃;
- 复制文件时注意权限,确保目标机器的用户有读取库文件和头文件的权限;
- 优先复制
make install后的安装目录,而不是编译的build目录——build目录里的临时文件可能包含编译机器的特定路径,容易出问题。
内容的提问来源于stack exchange,提问作者user4419382

