使用CMake编译含TBB、OpenCV的C++代码时出现多重定义错误
解决OpenCV与系统libpng重复符号定义的编译错误
这明显是重复符号冲突的问题——你的编译过程同时链接了两个不同版本的libpng库:一个是OpenCV自带的liblibpng.a(在3rdparty目录下),另一个是系统预装的libpng12.a。两个库都实现了png_warning这类png核心函数,链接器遇到重复定义就直接报错了。
下面给你几个可行的解决方案,按优先级排序:
方案1:强制使用系统libpng,禁用OpenCV自带版本
修改你的CMakeLists.txt,让CMake优先找到系统的libpng,再告诉OpenCV不要编译自带的版本:
# 先查找系统安装的libpng find_package(PNG REQUIRED) # 禁止OpenCV编译自带的3rdparty库(这里主要针对libpng) set(OPENCV_FORCE_3RDPARTY_BUILD OFF) find_package(OpenCV REQUIRED) # 链接时把系统libpng放在OpenCV库前面,确保优先使用 target_link_libraries(你的项目目标名 ${PNG_LIBRARIES} ${OpenCV_LIBS})
方案2:强制使用OpenCV自带libpng,屏蔽系统版本
如果系统libpng版本和你的OpenCV不兼容,那就反过来,让CMake忽略系统的libpng,只用OpenCV自带的:
# 告诉CMake已经找到png(其实是用OpenCV自带的),跳过系统查找 set(PNG_FOUND TRUE) set(PNG_INCLUDE_DIRS "") set(PNG_LIBRARIES "") # 强制OpenCV使用自带的3rdparty库 set(OPENCV_FORCE_3RDPARTY_BUILD ON) find_package(OpenCV REQUIRED) target_link_libraries(你的项目目标名 ${OpenCV_LIBS})
方案3:清理构建缓存,重新生成配置
有时候旧的CMake缓存会残留错误的依赖配置,先清理再重新编译:
# 进入你的build目录(如果用了out-of-source构建) cd build # 删除所有缓存文件 rm -rf * # 重新生成Makefile cmake .. # 再次编译 make
额外提示
如果你的项目代码里自己显式写了target_link_libraries(...) libpng这类语句,记得删掉——OpenCV本身已经会处理png的依赖,重复链接只会加剧冲突。
内容的提问来源于stack exchange,提问作者smsm smsm
相关产品推荐
相关产品推荐

