OpenCV imwrite 函数导致“未定义符号”

2023-12-02

我正在开发一个软件,它由一些带有 python 绑定的核心 C++ 代码组成。 C++ 代码已经使用了大量 OpenCV,但现在我试图在两者之间保存图像,但我似乎无法使用imwrite功能。将其添加到 main.cpp 中并使用“默认”构建在 eclipse 中进行编译是可行的,但为了将其与现有的 Python 代码一起使用,我需要使用 CMake 进行构建。这再次编译得很好,但是当我从 Python 类调用代码时,我收到此错误:

ImportError: /.../pythonCPP.so: undefined symbol: _ZN2cv7imwriteERKNS_6StringERKNS_11_InputArrayERKSt6vectorIiSaIiEE

我搜索了这个,从我所能收集到的信息来看,这通常似乎源于某种链接问题。我不知道从哪里开始在 CMake 文件中查找或添加任何标志。我在 Ubuntu 16.04 64 位上使用 OpenCV 3.2.0。

这是对应的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project("blah")

#----------------------------CMAKE & GLOBAL PROPERTIES-------------------------#
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

###============= C++11 support====================================
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if (COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -g0 -s -std=c++11")
elseif (COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -g0 -s -std=c++0x")
else ()
    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif ()
#=================================================================
# PYTHON option

set(PYTHON_OPTIONS "2.X" "3.X")
set(PYTHON_DESIRED_VERSION "3.X" CACHE STRING "Choose which python version to use, options are: ${PYTHON_OPTIONS}.")
set_property(CACHE PYTHON_DESIRED_VERSION PROPERTY STRINGS ${PYTHON_OPTIONS})


#=============== Find Packages
find_package(OpenCV 3 COMPONENTS core highgui imgproc REQUIRED)
message("Open CV version is ${OpenCV_VERSION}")
include("DetectPython")
if (${PYTHON_DESIRED_VERSION} STREQUAL "2.X")
    set(Python_ADDITIONAL_VERSIONS ${PYTHON2_VERSION_MAJOR}.${PYTHON2_VERSION_MINOR})
    find_package(Boost COMPONENTS python-py${PYTHON2_VERSION_MAJOR}${PYTHON2_VERSION_MINOR} REQUIRED)
else ()
    set(Python_ADDITIONAL_VERSIONS ${PYTHON3_VERSION_MAJOR}.${PYTHON3_VERSION_MINOR})
    find_package(Boost COMPONENTS python-py${PYTHON3_VERSION_MAJOR}${PYTHON3_VERSION_MINOR} REQUIRED)
endif ()

#========pick python stuff========================================
if (${PYTHON_DESIRED_VERSION} STREQUAL "2.X")
    SET(PYTHON_INCLUDE_DIRS ${PYTHON2_INCLUDE_DIR} ${PYTHON2_INCLUDE_DIR2} ${PYTHON2_NUMPY_INCLUDE_DIRS})
    SET(PYTHON_LIBRARIES ${PYTHON2_LIBRARY})
    SET(PYTHON_EXECUTABLE ${PYTHON2_EXECUTABLE})
    SET(PYTHON_PACKAGES_PATH ${PYTHON2_PACKAGES_PATH})
    SET(ARCHIVE_OUTPUT_NAME py2)
else ()
    SET(PYTHON_INCLUDE_DIRS ${PYTHON3_INCLUDE_DIR} ${PYTHON3_INCLUDE_DIR2} ${PYTHON3_NUMPY_INCLUDE_DIRS})
    SET(PYTHON_LIBRARIES ${PYTHON3_LIBRARY})
    SET(PYTHON_EXECUTABLE ${PYTHON3_EXECUTABLE})
    SET(PYTHON_PACKAGES_PATH ${PYTHON3_PACKAGES_PATH})
    SET(ARCHIVE_OUTPUT_NAME py3)
endif ()

file(GLOB project_sources ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

add_library(${PROJECT_NAME} SHARED ${project_sources} ${CMAKE_CURRENT_SOURCE_DIR}/include/pyboostcvconverter/pyboostcvconverter.hpp)
target_include_directories(${PROJECT_NAME} PUBLIC
        "${CMAKE_CURRENT_SOURCE_DIR}/include"
        ${Boost_INCLUDE_DIRS}
        ${OpenCV_INCLUDE_DIRS}
        ${PYTHON_INCLUDE_DIRS}
        )

target_link_libraries(${PROJECT_NAME}
        ${Boost_LIBRARIES}
        ${OpenCV_LIBRARIES}
        ${PYTHON_LIBRARIES}
        )

#---------------------------   INSTALLATION    -----------------------------------------------------
#-get proper extension for python binary shared object on this platform
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('SO'))"
        RESULT_VARIABLE PYTHON_${PROJECT_NAME}_PY_PROCESS
        OUTPUT_VARIABLE ${PROJECT_NAME}_PY_SUFFIX
        OUTPUT_STRIP_TRAILING_WHITESPACE)

set_target_properties(${PROJECT_NAME} PROPERTIES
        ARCHIVE_OUTPUT_NAME ${ARCHIVE_OUTPUT_NAME}  # prevent name conflict for python2/3 outputs
        PREFIX ""
        OUTPUT_NAME py
        SUFFIX ${${PROJECT_NAME}_PY_SUFFIX})

if (MSVC AND NOT PYTHON_DEBUG_LIBRARIES)
    set(PYTHON_INSTALL_CONFIGURATIONS CONFIGURATIONS Release)
else ()
    set(PYTHON_INSTALL_CONFIGURATIONS "")
endif ()

if (WIN32)
    set(PYTHON_INSTALL_ARCHIVE "")
else ()
    set(PYTHON_INSTALL_ARCHIVE ARCHIVE DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT python)
endif ()

install(TARGETS ${PROJECT_NAME}
        ${PYTHON_INSTALL_CONFIGURATIONS}
        RUNTIME DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT python
        LIBRARY DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT python
        ${PYTHON_INSTALL_ARCHIVE}
        )

我不是最好的cmake,但您似乎未能链接imwrite()功能。

我使用的是 Mac,所以如果您在其他地方,情况会有所不同,但是如果您查看 OpenCV 库目录,特别是在libopencv_imgcodecs.dylib像这样:

nm -gUP  libopencv_imgcodecs.dylib | grep -i write

你会看到类似的东西:

__ZN2cv7imwriteERKNS_6StringERKNS_11_InputArrayERKNSt3__16vector...

这意味着imgcodecs提供您需要的功能。

我希望(感谢@Ptaq666)可靠地告知我添加此库的最佳方法是使用:

find_package(OpenCV 3 REQUIRED)

其次是:

target_link_libraries(<as you already have> ${OpenCV_LIBRARIES})

原创建议

这意味着imgcodecs提供了您需要的功能,所以我认为您需要将其添加到您的这一行中CMakeLists.txt:

find_package(OpenCV 3 COMPONENTS core highgui imgproc REQUIRED)

我想那会是这样的:

find_package(OpenCV 3 COMPONENTS core highgui imgproc imgcodecs REQUIRED)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV imwrite 函数导致“未定义符号” 的相关文章

  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 使用 conda 安装额外功能

    With pip我们可以使用方括号安装子包 例如与阿帕奇气流 https pythonhosted org airflow installation html pip install airflow all 有类似的东西吗conda或者我必
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • Django:显示管理员验证错误的自定义错误消息

    我正在使用 Django 1 2 4 我有一个模型 其中有一个需要验证的字段 当验证失败时 我想向用户显示自定义错误消息 模型编辑是在管理界面中完成的 这就是我目前正在做的事情 def clean fields self exclude N
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • g++ / gcc 是否支持 C++20 新的atomic_flag 功能?

    根据参考参数 https en cppreference com w cpp atomic atomic flag c 20 有丰富的 对我来说有用的 支持atomic flag运营 然而 目前尚不清楚 gcc 是否支持这些功能 它们在任何
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 从索贝尔确定图像梯度方向?

    我正在尝试使用 openCV 的 Sobel 方法的结果来确定图像梯度方向 我知道这应该是一个非常简单的任务 我从此处复制了许多资源和答案中的方法 但无论我做什么 所得方向始终在 0 57 度之间 我希望范围为 0 360 我相信所有的深度
  • python:xml.etree.ElementTree,删除“命名空间”

    我喜欢 ElementTree 解析 xml 的方式 特别是 Xpath 功能 我有一个带有嵌套标签的应用程序的 xml 输出 我想按名称访问此标签而不指定名称空间 这可能吗 例如 root findall molpro job 代替 ro
  • 具有行业级约束的 SciPy 投资组合优化

    尝试在这里优化投资组合权重分配 通过限制风险来最大化我的回报函数 我可以毫无问题地通过简单的约束 所有权重之和等于 1 找到产生我的回报函数的优化权重 并做出另一个约束 即我的总风险低于目标风险 我的问题是 如何为每个组添加行业权重界限 我
  • scikit-learn kmeans 聚类的初始质心

    如果我已经有一个可以作为初始质心的 numpy 数组 我该如何正确初始化 kmeans 算法 我正在使用 scikit learn Kmeans 类 这个帖子 具有选定初始中心的 k 均值 https stackoverflow com q
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 如何通过 Selenium 内部的文本查找按钮(Python)?

    我有以下三个按钮 我不知道如何获取其中的文本 例如异常值 我试过browser find element by link text Outliers click 但出现 无法找到元素 错误 我该怎么做 See find element by
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 具有重复值的 Sqlite 列

    就说专栏吧aSQLite 数据库的非常重复 始终有相同的 4 个值 其他值可能稍后出现 但不同值的数量将少于 1000 个 VALUES hello world it s a shame to store this str many tim
  • 使用 python/scipy 进行 voronoi 和 lloyd 松弛

    如何使用 Qhull 确定哪些 voronoi 单元 按索引 是 正确的 由 现有顶点 组成 我正在尝试使用 LLoyds 算法和 scipy spatial Voronoi 它是 Qhull 的包装器 生成的输入来执行约束松弛 就代码而言

随机推荐

  • 尝试将 Python 字典格式化为表时,BatchDataset 不可下标

    我正在努力通过TensorFlow 加载 pandas DataFrame 教程 我正在尝试修改创建字典切片的代码片段的输出 dict slices tf data Dataset from tensor slices df to dict
  • 重写 Zuul 过滤器 SendErrorFilter

    org springframework cloud netflix zuul filters post SendErrorFilter 类处理错误响应 我想重写此过滤器以在转发等时执行自定义响应而不是 ZuulException 我怎样才能
  • 如何查找数据框中每个日期对应的唯一ID的数量

    我有一个如下所示的数据框 date time id datetime 1 2015 01 02 14 27 22 130 999000000007628 2015 01 02 14 27 22 2 2015 01 02 14 41 27 7
  • 在 Android 中添加 Layer 库依赖项会抑制 requestPermissions 对话框

    我制作了一个非常非常小的演示应用程序 在运行 Android 版本 6 0 1 的 Nexus 5 上重现该错误 该应用程序位于 github 上 https github com lexi sr LayerPermission 我最近添加
  • 执行矩阵的成对比较

    我有一个由 n 个变量组成的矩阵 我想创建一个新矩阵 它是每个向量的成对差异 但不是其本身 这是数据的示例 Transportation services Recreational goods and vehicles Recreation
  • 使用 RecyclerView 可以扩展列表吗?

    可以将可扩展列表项与新的 RecyclerView 一起使用吗 喜欢 ExpandableListView 吗 使用库存布局管理器可以很简单地做到这一点 这完全取决于您如何管理适配器 当您想要扩展某个部分时 只需在标题之后将新项目添加到适配
  • GCM 注册时出现 INVALID_SENDER 错误

    我正在开发应用程序 我想在其中实现推送通知 因为我正在使用 GCM 我已在 google console 上注册了我的项目 并使用项目 ID 作为 GCM 注册的 senderID GCMRegistrar checkDevice this
  • Android 的基本组件的类加载和_java对象_生命周期

    虽然从 API 角度来看 关于应用程序 活动等生命周期的资源有无数 onCreate Destroy Whatnot 方法 几乎没有任何关于这些组件的实际对象生命周期的信息从Java的角度来看 例如 我 在 YouTube marakana
  • 使 Adob​​e 字体在 IE9 中与 CSS3 @font-face 配合使用

    我正在构建一个小型 Intranet 应用程序 并尝试使用 但没有运气Adobe字体我最近购买了 据我所知 在我们的案例中 这并不违反许可证 我将 ttf otf 版本的字体转换为 woff eot 和 svg 以便针对所有主要浏览器 我使
  • 如何动态更改 JXTreeTable 中特定单元格的颜色

    我在用JXTreeTable现在为了制作树表结构 我想动态更改特定单元格的颜色 如何改变单元格的颜色 我发现这段代码可以改变颜色 但这不起作用 这是代码 leftTree setDefaultRenderer Object class ne
  • 在Python中获取或构建PEM证书链

    是否可以使用 ssl 和 Python 获取 PEM 格式的整个证书链 我可以通过以下方式获得具体的 import ssl addr 192 0 2 1 cert str ssl get server certificate addr 44
  • Python - TypeError:listen() 缺少 1 个必需的位置参数:'self'

    我一直在 PyCharm 中开发 AI 但我似乎在尝试调用方法来尝试获取音频输入时遇到了 voice recognition 错误 Users waynedeng Desktop AI venv bin python Users wayne
  • 如何将新的用户控件添加到工具箱或新的 Winform?

    我有一个现有的库 不是 Winforms 应用程序 它为真正的 Windows 应用程序提供一些 Winforms 在这个库中 我想创建一个用户控件来将一些控件分组在一起 为了实现这一目标 我右键单击 添加 用户控制并将一些控件拖到新的用户
  • 在 Sublime Text 构建系统中使用自定义变量

    我正在 macOS 上配置 Sublime Text ST 构建系统 我想创建一个构建系统变体 将构建产品输出到我的用户库中的文件夹 但我找不到解决该目录的方法 The ST 构建系统文档提到构建系统变量的可用性 但它们都不允许我寻址我的主
  • 集合视图,具有自定义布局,单元格在滚动时行为异常

    我正在尝试使用 UICollectionView 创建自定义平铺布局 一旦我运行我的应用程序 它就会在模拟器中完美呈现 但是当我滚动视图并将其带回时 所有单元格的框架都会发生变化 并且单元格会重叠 随机留下空格 过去两天我无法解决这个问题
  • 如何在“CollectionEditor”对话框中启用属性的默认值

    请先阅读整个问题以理解where我将能够重置属性的默认值 当定义一个可以可视化设计的自定义类时 可以实现一个集合编辑器来修改列表 数组 集合等属性 使用以下模式 Editor typeof CollectionEditor typeof U
  • 使用 Microsoft Jet OLEDB 的 CSV 列限制

    我正在从包含大约 350 列的 CSV 导入数据 这个 CSV 导入是固定的 我完全无法控制它 如果我尝试在 Excel 2003 中打开 CSV 由于列限制为 255 IV 它只能部分加载 当我使用 OleDb 和 Microsoft J
  • Python 挑战字符串编码

    我有以下提供者列表 俄语 providers u u041e u041e u041e u041a u0432 u0430 u0440 u0442 u0430 u043b u041b u0435 u043e u043f u043e u043b
  • 如何在 Spring.NET 中配置静态类的属性?

    如何通过 Spring NET 配置静态类 考虑下面的类 static class Abc public Interface xyz get set public void Show xyz show 也许解决方法可以帮助 这不是一个静态类
  • OpenCV imwrite 函数导致“未定义符号”

    我正在开发一个软件 它由一些带有 python 绑定的核心 C 代码组成 C 代码已经使用了大量 OpenCV 但现在我试图在两者之间保存图像 但我似乎无法使用imwrite功能 将其添加到 main cpp 中并使用 默认 构建在 ecl