добавить каталоги как объектные библиотеки в интерфейсную библиотеку - PullRequest
0 голосов
/ 14 июня 2019

Официальный способ сборки пакетов opencv_contrib с opencv - это сборка их с дополнительными флагами.Это работает хорошо, но это не то, что я ищу, так как я хотел протестировать - и в конечном итоге остановился - на packageManager (conan) и не смог заставить conan встроить pkgs contrib в сам opencv.Я действительно не пытался, но это определенно возможно, но другой вопрос.

То, что я в итоге сделал, и я не уверен, является ли это просто ненужным усложнением, заключается в том, чтобы редко извлекать источники библиотек, которые я хочу отдельно, и пытаться создавать их как библиотеки объектов, объединяя их через интерфейсную библиотеку.затем включить в основной проект.Я рассматриваю это главным образом как временное решение для библиотек, у которых еще нет связанных cmake-build.Опять же, это звучит как серьезный подход к моим ушам, но это также первый большой проект на 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:Я не думаю, что я достаточно ясно дал понять, что забочусь об эффективных решениях только после того, как понял, почему текущий подход неправильно связывает.Это может быть тривиальный вопрос, который я хочу прояснить для себя и потомства, так как я не нашел объяснения этому.

В более старом потоке обсуждаются проблемы в , связывающие библиотеки объектов с интерфейсами , которые соотносятся с "ошибкой" cmake, исправленной с помощью merge в cmake@3.9.

Я попробовал эти предложения, но все еще застрял с теми же сообщениями об ошибках и не понимаю, почему объектные файлы не скомпилированы или не связаны должным образом.Поскольку объектные библиотеки теперь должны работать транзитивно с интерфейсными библиотеками, я не вижу ошибки.

Вот более абстрактная и желаемая версия:

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)

1 Ответ

0 голосов
/ 14 июня 2019

В пакете Conan для OpenCV по умолчанию нет участия, необходимо включить его с помощью следующей опции:

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