【问题标题】:add directories as object-libraries to interface-library将目录作为对象库添加到接口库
【发布时间】: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 方面,但是关于稀疏检查的子模块树有一个有趣的点我没有提到。

标签: git opencv cmake conan


【解决方案1】:

OpenCV的Conan包默认没有开启contrib,需要通过如下选项开启:

conan install -r conan-center opencv/4.1.0@conan/stable -o opencv:contrib=True

【讨论】:

  • 引用我自己的话:“...这绝对是可能的,但是 [...] 另一个问题”。这将回答这个问题 - 在我测试之后,但我认为这会解决它,所以谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
相关资源
最近更新 更多