Cmake - 使用 OpenCV 生成共享库
Cmake - Generate shared library with OpenCV inside
我使用以下 CmakeList.txt
编译了一个 .so
文件:
cmake_minimum_required(VERSION 3.5.1)
project(phase)
SET(OpenCV_INCLUDE_DIRS "/usr/local/include/opencv")
include_directories(INCLUDE_DIR include ${OpenCV_INCLUDE_DIRS})
set(OpenCV_LIB_DIR "/usr/local/lib")
link_directories(${OpenCV_LIB_DIR})
aux_source_directory(src SOURCE)
add_library(dct SHARED src/dct.c ${SOURCE})
它没有给我任何错误。我想在 Python 项目中使用它:
import numpy as np
import numpy.ctypeslib as npct
from ctypes import c_int, c_double
_array_1d_floatBase = npct.ndpointer(dtype=np.float32, ndim=1, flags="CONTIGUOUS")
def _from_param(cls, obj):
if obj is None:
return obj
return _array_1d_floatBase.from_param(obj)
array_1d_float = type(
'DoubleArrayType',
(_array_1d_floatBase,),
{'from_param': classmethod(_from_param)}
)
array_1d_double = npct.ndpointer(dtype=np.double, ndim=1, flags="CONTIGUOUS")
libcd = npct.load_library("/home/facu/libdct.so", ".")
libcd.FastCosineTransform.restype = None
libcd.FastCosineTransform.argtypes = [array_1d_float, c_int, c_int, c_int]
def dct_lib(in_array, xsize, ysize, sign):
libcd.FastCosineTransform(in_array, xsize, ysize, sign)
return in_array
in_array = laplacian
print in_array
out_dct = dct_lib(in_array, 512, 512, 1)
但它给我以下错误:
OSError: /home/facu/libdct.so: undefined symbol: cvGetSeqElem
我想我的 cmake 文件中遗漏了一些东西。我需要包含哪些内容才能生成包含 OpenCV 的 .so
?
我没有在您的 CMakeLists.txt 中找到您实际调用 target_link_libraries(dct opencv)
之类的部分。我不确定是否有像 find_package(opencv REQUIRED)
或类似的查找例程,或者如果您计划使用 find_package
是否必须构建一个。
您必须 link 图书馆本身的某个地方。到目前为止,您只是将库所在的路径设置为 link,而不是将实际的库名称设置为 link。
编辑:Google 是你的朋友。 Here 您将了解如何 link 使用 CMake 对抗 openCV。
我使用以下 CmakeList.txt
编译了一个 .so
文件:
cmake_minimum_required(VERSION 3.5.1)
project(phase)
SET(OpenCV_INCLUDE_DIRS "/usr/local/include/opencv")
include_directories(INCLUDE_DIR include ${OpenCV_INCLUDE_DIRS})
set(OpenCV_LIB_DIR "/usr/local/lib")
link_directories(${OpenCV_LIB_DIR})
aux_source_directory(src SOURCE)
add_library(dct SHARED src/dct.c ${SOURCE})
它没有给我任何错误。我想在 Python 项目中使用它:
import numpy as np
import numpy.ctypeslib as npct
from ctypes import c_int, c_double
_array_1d_floatBase = npct.ndpointer(dtype=np.float32, ndim=1, flags="CONTIGUOUS")
def _from_param(cls, obj):
if obj is None:
return obj
return _array_1d_floatBase.from_param(obj)
array_1d_float = type(
'DoubleArrayType',
(_array_1d_floatBase,),
{'from_param': classmethod(_from_param)}
)
array_1d_double = npct.ndpointer(dtype=np.double, ndim=1, flags="CONTIGUOUS")
libcd = npct.load_library("/home/facu/libdct.so", ".")
libcd.FastCosineTransform.restype = None
libcd.FastCosineTransform.argtypes = [array_1d_float, c_int, c_int, c_int]
def dct_lib(in_array, xsize, ysize, sign):
libcd.FastCosineTransform(in_array, xsize, ysize, sign)
return in_array
in_array = laplacian
print in_array
out_dct = dct_lib(in_array, 512, 512, 1)
但它给我以下错误:
OSError: /home/facu/libdct.so: undefined symbol: cvGetSeqElem
我想我的 cmake 文件中遗漏了一些东西。我需要包含哪些内容才能生成包含 OpenCV 的 .so
?
我没有在您的 CMakeLists.txt 中找到您实际调用 target_link_libraries(dct opencv)
之类的部分。我不确定是否有像 find_package(opencv REQUIRED)
或类似的查找例程,或者如果您计划使用 find_package
是否必须构建一个。
您必须 link 图书馆本身的某个地方。到目前为止,您只是将库所在的路径设置为 link,而不是将实际的库名称设置为 link。
编辑:Google 是你的朋友。 Here 您将了解如何 link 使用 CMake 对抗 openCV。