Ubuntu下编译带PV_API支持的OpenCV时链接错误的解决方法
问题描述
- 环境:Ubuntu系统,使用OpenCV交互式校准工具搭配GigE相机
- 编译报错:链接阶段提示
timer_settime、timer_delete、timer_create等函数未定义 - 背景:已下载Allied Vision旧版PV_API(原PV_API已废弃),希望避免直接对接相机SDK
- 尝试无效的操作:通过
CMAKE_CXX_FLAGS和add_link_options()添加-lrt参数,未解决链接错误
正确的CMake配置(解决-lrt链接问题)
如果全局添加-lrt没生效,核心问题是opencv_videoio模块没有关联到rt库,针对性处理即可:
1. 编译OpenCV时修改videoio模块配置
如果你是自己编译OpenCV,找到modules/videoio/CMakeLists.txt,找到opencv_videoio的目标定义部分,添加:
target_link_libraries(opencv_videoio PRIVATE rt)
保存后重新编译OpenCV,这样opencv_videoio会自动链接rt库,解决函数未定义的问题。
2. 在自己的项目中强制链接
如果是基于预编译OpenCV开发校准工具,直接在你的项目CMakeLists.txt里给目标添加rt库链接:
find_package(OpenCV REQUIRED COMPONENTS videoio calib3d highgui) add_executable(calibration_tool your_calibration_code.cpp) target_link_libraries(calibration_tool PRIVATE ${OpenCV_LIBS} rt)
这种方式会把-lrt直接加入你的可执行文件的链接参数,覆盖OpenCV模块缺失的依赖。
Ubuntu上OpenCV支持GigE的最简方案
不想折腾PV_API的话,推荐用以下两种更简单的方式:
1. 用OpenCV + GStreamer后端
GigE相机大多支持通过GStreamer获取流,步骤如下:
- 安装依赖:
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libaravis-0.8-dev - 重新编译OpenCV时启用GStreamer:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF <你的OpenCV源码目录> make -j$(nproc) sudo make install - 之后用OpenCV的
VideoCapture直接读取相机流,示例代码:#include <opencv2/opencv.hpp> int main() { // 替换为你的GigE相机对应的GStreamer pipeline cv::VideoCapture cap("aravisgssrc ! videoconvert ! appsink"); if (!cap.isOpened()) { return -1; } cv::Mat frame; while (cap.read(frame)) { cv::imshow("GigE Camera Feed", frame); if (cv::waitKey(1) == 'q') break; } return 0; }
2. 直接用系统预编译OpenCV包
部分Ubuntu版本的官方源中,OpenCV预编译包已经启用了GStreamer支持,直接安装即可:
sudo apt install libopencv-dev opencv-data
安装后可以直接用上述GStreamer pipeline的方式读取相机流,无需手动编译OpenCV。
内容的提问来源于stack exchange,提问作者George Profenza
相关产品推荐
相关产品推荐

