【发布时间】:2019-06-14 16:21:05
【问题描述】:
使用 opencv 构建 opencv_contrib 包的官方方法是使用附加标志构建它们。这很好用,但不是我想要的,因为我想测试 - 并最终解决 - 一个 packageManager (conan) 并且无法让 conan 将 contrib pkgs 构建到 opencv 本身中。我还没有真正尝试过,但这绝对是可能的,但另一个问题。
我最终做了什么,我不确定这是否只是一个不必要的复杂性,是稀疏地单独提取我想要的库的源并尝试将它们构建为对象库,将它们整合到一个接口库中然后包含在主项目中。我认为这主要是针对尚未关联 cmake-builds 的库的临时解决方案。 再一次,这听起来像是一种可靠的方法,但它也是我正在做的第一个更大的 c++ 项目,所以我真的不知道。
目前的情况(显然不是整个 cmakelists.txt,而是库的相关部分):
## OPENCV_CONTRIB
MACRO(SUBDIRLIST result curdir)
FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
SET(dirlist /*)
SET(dirlist "")
FOREACH(child ${children})
IF(IS_DIRECTORY ${curdir}/${child})
LIST(APPEND dirlist ${child})
ENDIF()
ENDFOREACH()
SET(${result} ${dirlist})
ENDMACRO(SUBDIRLIST)
SUBDIRLIST(CVCONTRIB ${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv_contrib/modules)
add_library(OPENCV_CONTRIB INTERFACE)
set(libs "")
FOREACH(DIRNAME IN LISTS CVCONTRIB)
set(libpath ${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv_contrib/modules/${DIRNAME})
file(TO_CMAKE_PATH ${libpath} LIBPATH)
# not sure if cheaing?
target_include_directories(archiver PUBLIC ${LIBPATH}/include)
string(REGEX MATCH "(/$)?.*" libName ${DIRNAME})
set(MAIN ${LIBPATH}/include/opencv2/${libName}.hpp)
add_library(${libName} OBJECT ${MAIN} ${LIBPATH}/src)
file(GLOB_RECURSE t_LIB_SOURCES "${LIBPATH}/*.c(pp)?")
file(GLOB_RECURSE t_HEAD_SOURCES "${LIBPATH}/*.h(pp)?")
set_target_properties(${libName} PROPERTIES PUBLIC_HEADER ${MAIN})
target_sources(${libName} PRIVATE ${MAIN} ${t_LIB_SOURCES} ${t_HEAD_SOURCES})
target_link_libraries(${libName} PRIVATE CONAN_PKG::opencv)
target_link_libraries(OPENCV_CONTRIB INTERFACE $<TARGET_OBJECTS:${libName}> CONAN_PKG::opencv)
list(APPEND libs ${libName})
ENDFOREACH(DIRNAME)
conan_target_link_libraries(archiver CONAN_LIBS OPENCV_CONTRIB)
我没有得到正确的链接。 我想象构建的库没有正确链接到可执行文件。此外,我在与库相关的输出目录中看不到任何内容。
这是收到的错误代码:
/usr/local/bin/gmake -f CMakeFiles/archiver.dir/build.make CMakeFiles/archiver.dir/build
gmake[3]: Entering directory '/Users/yggdrasilk/Code/archiver/cmake-build-debug-g'
[ 5%] Linking CXX executable bin/archiver
"/Users/yggdrasilk/Library/Application Support/JetBrains/Toolbox/apps/CLion/ch-0/191.7479.33/CLion.app/Contents/bin/cmake/mac/bin/cmake" -E cmake_link_script CMakeFiles/archiver.dir/link.txt --verbose=1
/usr/bin/g++ -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/archiver.dir/src/Archiver.cpp.o CMakeFiles/archiver.dir/src/Binarization.cpp.o CMakeFiles/archiver.dir/src/BlurDetection.cpp.o CMakeFiles/archiver.dir/src/ColorBalance.cpp.o CMakeFiles/archiver.dir/src/Correct.cpp.o CMakeFiles/archiver.dir/src/Cropping.cpp.o CMakeFiles/archiver.dir/src/Deblur.cpp.o CMakeFiles/archiver.dir/src/Denoising.cpp.o CMakeFiles/archiver.dir/src/Deskew.cpp.o CMakeFiles/archiver.dir/src/FormatConvert.cpp.o CMakeFiles/archiver.dir/src/Recognize.cpp.o CMakeFiles/archiver.dir/src/Resize.cpp.o CMakeFiles/archiver.dir/src/Rotate.cpp.o CMakeFiles/archiver.dir/src/SauvolaBinarization.cpp.o CMakeFiles/archiver.dir/src/Smoothing.cpp.o CMakeFiles/archiver.dir/src/Thinning.cpp.o CMakeFiles/archiver.dir/src/Warp.cpp.o CMakeFiles/archiver.dir/src/logger.cpp.o -o bin/archiver /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_stitching.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_photo.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_video.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_ml.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_calib3d.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_features2d.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_highgui.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_videoio.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_flann.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_imgcodecs.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_objdetect.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_imgproc.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_core.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/libopencv_gapi.a /Users/yggdrasilk/.conan/data/opencv/4.0.1/conan/stable/package/a5201fed963b7747c43479523cd0fb03dfc21dee/lib/opencv4/3rdparty/libade.a /Users/yggdrasilk/.conan/data/libwebp/1.0.0/bincrafters/stable/package/14cb35775e7417784856b851b6e62c63c3212da8/lib/libwebpmux.a /Users/yggdrasilk/.conan/data/libwebp/1.0.0/bincrafters/stable/package/14cb35775e7417784856b851b6e62c63c3212da8/lib/libwebpdemux.a /Users/yggdrasilk/.conan/data/libwebp/1.0.0/bincrafters/stable/package/14cb35775e7417784856b851b6e62c63c3212da8/lib/libwebpdecoder.a /Users/yggdrasilk/.conan/data/libwebp/1.0.0/bincrafters/stable/package/14cb35775e7417784856b851b6e62c63c3212da8/lib/libwebp.a /Users/yggdrasilk/.conan/data/jasper/2.0.14/conan/stable/package/304a98577556adc78edd0be8496a489b47209b16/lib/libjasper.a /Users/yggdrasilk/.conan/data/openexr/2.3.0/conan/stable/package/9d2d4a9261c738e45b16918ddc333676c11bf8f8/lib/libIlmImf-2_3_s.a /Users/yggdrasilk/.conan/data/openexr/2.3.0/conan/stable/package/9d2d4a9261c738e45b16918ddc333676c11bf8f8/lib/libIlmImfUtil-2_3_s.a /Users/yggdrasilk/.conan/data/openexr/2.3.0/conan/stable/package/9d2d4a9261c738e45b16918ddc333676c11bf8f8/lib/libIlmThread-2_3_s.a /Users/yggdrasilk/.conan/data/openexr/2.3.0/conan/stable/package/9d2d4a9261c738e45b16918ddc333676c11bf8f8/lib/libIex-2_3_s.a /Users/yggdrasilk/.conan/data/openexr/2.3.0/conan/stable/package/9d2d4a9261c738e45b16918ddc333676c11bf8f8/lib/libHalf-2_3_s.a /Users/yggdrasilk/.conan/data/protobuf/3.5.2/bincrafters/stable/package/180c83b442b8b30fb19151eca5509796e51d441b/lib/libprotobufd.a /Users/yggdrasilk/.conan/data/protobuf/3.5.2/bincrafters/stable/package/180c83b442b8b30fb19151eca5509796e51d441b/lib/libprotocd.a /Users/yggdrasilk/.conan/data/harfbuzz/2.4.0/bincrafters/stable/package/d8b434885371812acd466ecf09b9168bccd3c986/lib/libharfbuzz.a -framework CoreFoundation -framework CoreText -framework CoreFoundation -framework CoreText /Users/yggdrasilk/.conan/data/freetype/2.9.1/bincrafters/stable/package/d3eb8030c52ed53148828b1323ac0f3823c5a86d/lib/libfreetyped.a /Users/yggdrasilk/.conan/data/bzip2/1.0.6/conan/stable/package/78ab9b2bad3359502e214008abda7b45b0b9daa0/lib/libbz2.a -framework OpenCL -framework Accelerate -framework CoreMedia -framework CoreVideo -framework AVFoundation -framework QuartzCore -framework Cocoa -framework OpenCL -framework Accelerate -framework CoreMedia -framework CoreVideo -framework AVFoundation -framework QuartzCore -framework Cocoa -framework CoreGraphics /Users/yggdrasilk/.conan/data/tesseract/4.0.0/bincrafters/stable/package/38d9113326e833ce377ceae065a42b4536189a4a/lib/libtesseract.a /Users/yggdrasilk/.conan/data/leptonica/1.76.0/bincrafters/stable/package/4eae2ddfff0f0e44b7bace55fbe01dbac9f52a98/lib/libleptonica.a /Users/yggdrasilk/.conan/data/libjpeg/9c/bincrafters/stable/package/1513b3452ef7e2a2dd5f931247c5e02edeb98cc9/lib/libjpeg.a /Users/yggdrasilk/.conan/data/libtiff/4.0.9/bincrafters/stable/package/578b8eece3b2a6547d988711343c11038dc98f5f/lib/libtiff.a /Users/yggdrasilk/.conan/data/libtiff/4.0.9/bincrafters/stable/package/578b8eece3b2a6547d988711343c11038dc98f5f/lib/libtiffxx.a /Users/yggdrasilk/.conan/data/giflib/5.1.4/bincrafters/stable/package/1513b3452ef7e2a2dd5f931247c5e02edeb98cc9/lib/libgif.a /Users/yggdrasilk/.conan/data/libpng/1.6.34/bincrafters/stable/package/578b8eece3b2a6547d988711343c11038dc98f5f/lib/libpng16d.a /Users/yggdrasilk/.conan/data/zlib/1.2.11/conan/stable/package/1513b3452ef7e2a2dd5f931247c5e02edeb98cc9/lib/libz.a /Users/yggdrasilk/.conan/data/fmt/5.3.0/bincrafters/stable/package/180c83b442b8b30fb19151eca5509796e51d441b/lib/libfmtd.a
Undefined symbols for architecture x86_64:
"cv::xphoto::createSimpleWB()", referenced from:
_whiteBalance in ColorBalance.cpp.o
"cv::xphoto::createGrayworldWB()", referenced from:
_whiteBalance in ColorBalance.cpp.o
"cv::ximgproc::niBlackThreshold(cv::_InputArray const&, cv::_OutputArray const&, double, int, int, double, int)", referenced from:
_binarize in Binarization.cpp.o
"cv::ximgproc::thinning(cv::_InputArray const&, cv::_OutputArray const&, int)", referenced from:
_thinning in Thinning.cpp.o
"prl::sauvolaBinarization(cv::Mat&, cv::Mat&, int, double, int)", referenced from:
_binarize in Binarization.cpp.o
ld: symbol(s) not found for architecture x86_64
任何帮助将不胜感激。
编辑 0:
我认为我没有说得足够清楚,以至于只有在我理解了为什么当前的方法没有正确链接之后,我才关心有效的解决方案。
这很可能是一件小事,我想为自己和后代阐明,因为我没有找到解释。
在linking object libraries to interfaces 中有一个较旧的线程讨论问题,它们与在cmake@3.9 中用merge 修复的cmake 'bug' 相关。
我已经尝试了这些建议,但仍然遇到相同的错误消息,并且不明白为什么没有正确编译或链接目标文件。由于对象库现在应该与接口库一起工作,我看不到错误。
这是更抽象的 - 和如意的 - 版本:
add_executable(main PUBLIC main.cpp)
target_sources(definition_sources, declaration_sources)
add_library(extLib PUBLIC externalLib)
add_library(interface INTERFACE)
FOREACH(dir IN LISTS libs)
add_library(${dir} OBJECT mainHeader.hpp)
target_sources(${dir} lib_dec_Sources lib_def_Sources)
target_link_library(${dir} PUBLIC externalLib)
target_link_library(interface $<OBJECT_TARGETS:${dir})
ENDFOREACH(dir)
target_link_libraries(main PUBLIC externalLib interface)
【问题讨论】:
-
这似乎与Git无关;为什么是标签?
-
是的,它与 git 的关系非常松散,示例中的模块是通过某种形式的版本控制拉取的——在本例中是 git。我标记它是因为 cmake 目标是单独提取的源代码,它依赖于其他已经打包的库。这个问题绝对不在 git 方面,但是关于稀疏检查的子模块树有一个有趣的点我没有提到。