OpenCV imwrite 函数导致'undefined symbol'
OpenCV imwrite function causes 'undefined symbol'
我正在开发一个软件,它由一些带有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)
相关文章:
- 从 C 可执行文件加载动态库时收到错误C++"undefined symbol"
- 为什么当我在 C 程序中链接静态库时会"undefined symbol"?
- OpenCV imwrite 函数导致'undefined symbol'
- 在 Python 3.6 中调用C++扩展时导入错误"undefined symbol: _ZNK9FastNoise8GetNoiseEff"
- PostgreSQL & CMakeLists - Undefined symbol [...] _my_sock_read in libpq.a(fe-secure-openssl.o)
- C++ Python 模块导入错误: "undefined symbol: Py_InitModule3" ( Py_InitModule () )
- clang.cindex.LibclangError "Undefined symbol clang_CXXRecord_isAbstract"
- 函数"Undefined symbol"错误
- 链接器为某些上下文中使用的集成静态常量成员提供错误"undefined symbol"
- JNI退出"undefined symbol"
- 导入 SWIG+python 模块时出现"undefined symbol"错误
- 混合 C/C++ 代码可产生"undefined symbol"共享库
- Swig C to Python ImportError: undefined symbol
- 运行时 c++ "undefined symbol"异常
- 如何解决"relocation truncated to fit: R_X86_64_PC32 against undefined symbol `xercesc_3_1::AbstractDOMPa
- 线程"main" java.lang.UnsatisfiedLinkError: undefined symbol: test
- libboost_python3.so.1.56.0: undefined symbol: PyClass_Type
- 调试SWIG PHP扩展:undefined symbol: _ZN15SplashOutputDev9updateAl
- 为什么 Avahi "ant test-browse"因"libavahi4j.so: undefined symbol: avahi_malloc"而失败?
- QT QLibrary "Cannot load library *.so: (*.so: undefined symbol: staticMetaObject)"