OpenCV在C++中编译失败:undefined reference错误求助
解决OpenCV编译时的"undefined reference"错误
你遇到的核心问题是编译过程中没有正确链接OpenCV库,不管是直接使用g++还是CMake构建,都有对应的小细节需要修正,下面一步步来解决:
一、直接使用g++编译的问题
你的编译命令写法有误,pkg-config --cflags --libs opencv的输出需要通过命令替换传入g++,否则系统会把pkg-config当成要编译的源文件,导致库链接参数根本没生效。
正确的命令应该是:
/usr/bin/g++ -g main.cpp $(pkg-config --cflags --libs opencv) -o play
$(...)会执行括号里的命令,把输出作为参数传给g++-o play指定生成的可执行文件名,方便后续运行
二、CMake构建的问题
你的CMakeLists.txt已经正确找到了OpenCV的头文件和库,但缺少将库链接到目标程序的关键步骤,导致编译时无法找到OpenCV函数的实现。
修改后的CMakeLists.txt需要添加target_link_libraries指令:
set(CMAKE_VERBOSE_MAKEFILE ON) cmake_minimum_required(VERSION 3.16) project(play) set(CMAKE_CXX_STANDARD 14) find_package(OpenCV REQUIRED) message(STATUS "OpenCV_INCLUDE_DIRS = ${OpenCV_INCLUDE_DIRS}") message(STATUS "OpenCV_LIBS = ${OpenCV_LIBS}") add_executable(play main.cpp) # 新增这一行:将OpenCV库链接到你的可执行程序 target_link_libraries(play ${OpenCV_LIBS})
执行cmake . && make重新构建,应该就能正常编译了。
关于OpenCV_LIBS的疑问
你看到的OpenCV_LIBS格式是完全正确的!find_package(OpenCV REQUIRED)已经自动处理了库的路径信息,这些库名会被CMake解析为对应的库文件路径,不需要手动添加-L或者路径前缀。
另外补充一点:从你的pkg-config输出看,你安装的OpenCV版本应该是3.x(因为库名是opencv_core而不是opencv4/core),如果后续升级到OpenCV4,pkg-config的参数会变成pkg-config --cflags --libs opencv4,不过当前版本下你的配置没问题。
内容的提问来源于stack exchange,提问作者Tim K
相关产品推荐
相关产品推荐

