簡體   English   中英

Mac OS c ++鏈接OpenCV和libtiff

[英]Mac OS c++ Link OpenCV and libtiff

我最近寫了一個代碼來加載TIFF圖像(使用libtiff)並用opencv顯示(我知道opencv可以讀取tiff,但是我需要閱讀它才能獲得更底層的控制)。

當我剛剛使用libtiff閱讀TIFF並進行編譯時。 沒關系。 編譯命令如下:

g++ -L /usr/local/lib/ -I /usr/local/include/ -ltiff libtiff_test.cpp -o libtiff_test

但是,當我將它們(OpenCV和Libtiff)放在一起時,就會出現問題。 編譯命令如下:

g++ -L /usr/local/lib/ -I /usr/local/include/ -ltiff -lopencv_core -lopencv_highgui -lopencv_imgcodecs libtiff_test.cpp -o libtiff_test

編譯器報告以下內容:體系結構x86_64的未定義符號。

The detailed information is as below(longer):
Undefined symbols for architecture x86_64:
  "ThermalImage::grfmt_tiff_err_handler_init", referenced from:
      ThermalImage::ThermalImage(char*) in ThermalImage-6b82a6.o
  "_cblas_cgemm", referenced from:
      lapack_gemm32fc(float const*, unsigned long, float const*, unsigned long, float, float const*, unsigned long, float, float*, unsigned long, int, int, int, int) in libopencv_core.a(hal_internal.cpp.o)
      lapack_gemm64fc(double const*, unsigned long, double const*, unsigned long, double, double const*, unsigned long, double, double*, unsigned long, int, int, int, int) in libopencv_core.a(hal_internal.cpp.o)
  "_cblas_dgemm", referenced from:
      lapack_gemm64f(double const*, unsigned long, double const*, unsigned long, double, double const*, unsigned long, double, double*, unsigned long, int, int, int, int) in libopencv_core.a(hal_internal.cpp.o)
  "_cblas_sgemm", referenced from:
      lapack_gemm32f(float const*, unsigned long, float const*, unsigned long, float, float const*, unsigned long, float, float*, unsigned long, int, int, int, int) in libopencv_core.a(hal_internal.cpp.o)
      lapack_gemm64f(double const*, unsigned long, double const*, unsigned long, double, double const*, unsigned long, double, double*, unsigned long, int, int, int, int) in libopencv_core.a(hal_internal.cpp.o)
  "_cblas_zgemm", referenced from:
      lapack_gemm64fc(double const*, unsigned long, double const*, unsigned long, double, double const*, unsigned long, double, double*, unsigned long, int, int, int, int) in libopencv_core.a(hal_internal.cpp.o)
  "_clBuildProgram", referenced from:
      cv::ocl::Program::Impl::Impl(cv::ocl::ProgramSource const&, cv::String const&, cv::String&) in libopencv_core.a(ocl.cpp.o)
  "_clCreateBuffer", referenced from:
      cv::ocl::OpenCLAllocator::allocate(cv::UMatData*, int, cv::UMatUsageFlags) const in libopencv_core.a(ocl.cpp.o)
      cv::ocl::OpenCLBufferPoolImpl::_allocateBufferEntry(cv::ocl::CLBufferEntry&, unsigned long) in libopencv_core.a(ocl.cpp.o)
      cv::ocl::Image2D::Impl::init(cv::UMat const&, bool, bool) in libopencv_core.a(ocl.cpp.o)
  "_clCreateCommandQueue", referenced from:
      cv::ocl::Queue::Impl::Impl(cv::ocl::Context const&, cv::ocl::Device const&) in libopencv_core.a(ocl.cpp.o)
  "_clCreateContext", referenced from:
      cv::ocl::Context::Impl::setDefault() in libopencv_core.a(ocl.cpp.o)
      cv::ocl::Context::Impl::Impl(int) in libopencv_core.a(ocl.cpp.o)
  "_clCreateImage", referenced from:
      cv::ocl::Image2D::Impl::init(cv::UMat const&, bool, bool) in libopencv_core.a(ocl.cpp.o)
  "_clCreateImage2D", referenced from:
      cv::ocl::Image2D::Impl::init(cv::UMat const&, bool, bool) in libopencv_core.a(ocl.cpp.o)
  "_clCreateKernel", referenced from:
      cv::ocl::Kernel::Impl::Impl(char const*, cv::ocl::Program const&) in libopencv_core.a(ocl.cpp.o)
  "_clCreateProgramWithBinary", referenced from:
      cv::ocl::Program::Impl::Impl(cv::String const&, cv::String const&) in libopencv_core.a(ocl.cpp.o)
  "_clCreateProgramWithSource", referenced from:
      cv::ocl::Program::Impl::Impl(cv::ocl::ProgramSource const&, cv::String const&, cv::String&) in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueCopyBuffer", referenced from:
      cv::ocl::OpenCLAllocator::copy(cv::UMatData*, cv::UMatData*, int, unsigned long const*, unsigned long const*, unsigned long const*, unsigned long const*, unsigned long const*, bool) const in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueCopyBufferRect", referenced from:
      cv::ocl::OpenCLAllocator::copy(cv::UMatData*, cv::UMatData*, int, unsigned long const*, unsigned long const*, unsigned long const*, unsigned long const*, unsigned long const*, bool) const in libopencv_core.a(ocl.cpp.o)
      cv::ocl::Image2D::Impl::init(cv::UMat const&, bool, bool) in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueCopyBufferToImage", referenced from:
      cv::ocl::Image2D::Impl::init(cv::UMat const&, bool, bool) in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueCopyImageToBuffer", referenced from:
      cv::ocl::convertFromImage(void*, cv::UMat&) in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueMapBuffer", referenced from:
      cv::ocl::OpenCLAllocator::deallocate(cv::UMatData*) const in libopencv_core.a(ocl.cpp.o)
      cv::ocl::OpenCLAllocator::map(cv::UMatData*, int) const in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueNDRangeKernel", referenced from:
      cv::ocl::Kernel::run(int, unsigned long*, unsigned long*, bool, cv::ocl::Queue const&) in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueReadBuffer", referenced from:
      cv::ocl::OpenCLAllocator::deallocate(cv::UMatData*) const in libopencv_core.a(ocl.cpp.o)
      cv::ocl::OpenCLAllocator::map(cv::UMatData*, int) const in libopencv_core.a(ocl.cpp.o)
      cv::ocl::OpenCLAllocator::download(cv::UMatData*, void*, int, unsigned long const*, unsigned long const*, unsigned long const*, unsigned long const*) const in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueReadBufferRect", referenced from:
      cv::ocl::OpenCLAllocator::download(cv::UMatData*, void*, int, unsigned long const*, unsigned long const*, unsigned long const*, unsigned long const*) const in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueTask", referenced from:
      cv::ocl::Kernel::runTask(bool, cv::ocl::Queue const&) in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueUnmapMemObject", referenced from:
      cv::ocl::OpenCLAllocator::deallocate(cv::UMatData*) const in libopencv_core.a(ocl.cpp.o)
      cv::ocl::OpenCLAllocator::unmap(cv::UMatData*) const in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueWriteBuffer", referenced from:
      cv::ocl::OpenCLAllocator::unmap(cv::UMatData*) const in libopencv_core.a(ocl.cpp.o)
      cv::ocl::OpenCLAllocator::upload(cv::UMatData*, void const*, int, unsigned long const*, unsigned long const*, unsigned long const*, unsigned long const*) const in libopencv_core.a(ocl.cpp.o)
  "_clEnqueueWriteBufferRect", referenced from:
      cv::ocl::OpenCLAllocator::upload(cv::UMatData*, void const*, int, unsigned long const*, unsigned long const*, unsigned long const*, unsigned long const*) const in libopencv_core.a(ocl.cpp.o)
  "_clFinish", referenced from:
      cv::ocl::Queue::finish() in libopencv_core.a(ocl.cpp.o)
      cv::ocl::attachContext(cv::String const&, void*, void*, void*) in libopencv_core.a(ocl.cpp.o)
      cv::ocl::Queue::operator=(cv::ocl::Queue const&) in libopencv_core.a(ocl.cpp.o)
      cv::ocl::Queue::~Queue() in libopencv_core.a(ocl.cpp.o)
      cv::ocl::Queue::create(cv::ocl::Context const&, cv::ocl::Device const&) in libopencv_core.a(ocl.cpp.o)
      cv::ocl::Queue::~Queue() in libopencv_core.a(ocl.cpp.o)
      cv::ocl::Kernel::run(int, unsigned long*, unsigned long*, bool, cv::ocl::Queue const&) in libopencv_core.a(ocl.cpp.o)
      ...
  "_clFlush", referenced from:
      cv::ocl::Image2D::Impl::init(cv::UMat const&, bool, bool) in libopencv_core.a(ocl.cpp.o)
  "_clGetDeviceIDs", referenced from:
      cv::ocl::Context::Impl::setDefault() in 
      ...
  "_ippicvsFlip_64f_I", referenced from:
      void cv::sort_<unsigned char>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<signed char>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<unsigned short>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<short>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<int>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<float>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<double>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      ...
  "_ippicvsFlip_8u_I", referenced from:
      void cv::sort_<unsigned char>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<signed char>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<unsigned short>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<short>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<int>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<float>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<double>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      ...
  "_ippicvsMaxEvery_16u", referenced from:
      cv::hal::max16u(unsigned short const*, unsigned long, unsigned short const*, unsigned long, unsigned short*, unsigned long, int, int, void*) in libopencv_core.a(arithm.cpp.o)
  "_ippicvsMaxEvery_32f", referenced from:
      cv::hal::max32f(float const*, unsigned long, float const*, unsigned long, float*, unsigned long, int, int, void*) in libopencv_core.a(arithm.cpp.o)
  "_ippicvsMaxEvery_64f", referenced from:
      cv::hal::max64f(double const*, unsigned long, double const*, unsigned long, double*, unsigned long, int, int, void*) in libopencv_core.a(arithm.cpp.o)
  "_ippicvsMaxEvery_8u", referenced from:
      cv::hal::max8u(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char*, unsigned long, int, int, void*) in libopencv_core.a(arithm.cpp.o)
  "_ippicvsMinEvery_16u", referenced from:
      cv::hal::min16u(unsigned short const*, unsigned long, unsigned short const*, unsigned long, unsigned short*, unsigned long, int, int, void*) in libopencv_core.a(arithm.cpp.o)
  "_ippicvsMinEvery_32f", referenced from:
      cv::hal::min32f(float const*, unsigned long, float const*, unsigned long, float*, unsigned long, int, int, void*) in libopencv_core.a(arithm.cpp.o)
  "_ippicvsMinEvery_64f", referenced from:
      cv::hal::min64f(double const*, unsigned long, double const*, unsigned long, double*, unsigned long, int, int, void*) in libopencv_core.a(arithm.cpp.o)
  "_ippicvsMinEvery_8u", referenced from:
      cv::hal::min8u(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char*, unsigned long, int, int, void*) in libopencv_core.a(arithm.cpp.o)
  "_ippicvsSortAscend_8u_I", referenced from:
      void cv::sort_<unsigned char>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<signed char>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<unsigned short>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<short>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<int>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<float>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<double>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      ...
  "_ippicvsSortDescend_8u_I", referenced from:
      void cv::sort_<unsigned char>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<signed char>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<unsigned short>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<short>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<int>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<float>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      void cv::sort_<double>(cv::Mat const&, cv::Mat&, int) in libopencv_core.a(matrix.cpp.o)
      ...
  "_sgels_", referenced from:
      lapack_QR32f(float*, unsigned long, int, int, int, float*, unsigned long, float*, int*) in libopencv_core.a(hal_internal.cpp.o)
      lapack_QR64f(double*, unsigned long, int, int, int, double*, unsigned long, double*, int*) in libopencv_core.a(hal_internal.cpp.o)
  "_sgeqrf_", referenced from:
      lapack_QR32f(float*, unsigned long, int, int, int, float*, unsigned long, float*, int*) in libopencv_core.a(hal_internal.cpp.o)
      lapack_QR64f(double*, unsigned long, int, int, int, double*, unsigned long, double*, int*) in libopencv_core.a(hal_internal.cpp.o)
  "_sgesdd_", referenced from:
      lapack_SVD32f(float*, unsigned long, float*, float*, unsigned long, float*, unsigned long, int, int, int) in libopencv_core.a(hal_internal.cpp.o)
      lapack_SVD64f(double*, unsigned long, double*, double*, unsigned long, double*, unsigned long, int, int, int) in libopencv_core.a(hal_internal.cpp.o)
  "_sgesv_", referenced from:
      lapack_LU32f(float*, unsigned long, int, float*, unsigned long, int, int*) in libopencv_core.a(hal_internal.cpp.o)
      lapack_LU64f(double*, unsigned long, int, double*, unsigned long, int, int*) in libopencv_core.a(hal_internal.cpp.o)
  "_sgetrf_", referenced from:
      lapack_LU32f(float*, unsigned long, int, float*, unsigned long, int, int*) in libopencv_core.a(hal_internal.cpp.o)
      lapack_LU64f(double*, unsigned long, int, double*, unsigned long, int, int*) in libopencv_core.a(hal_internal.cpp.o)
  "_sposv_", referenced from:
      lapack_Cholesky32f(float*, unsigned long, int, float*, unsigned long, int, bool*) in libopencv_core.a(hal_internal.cpp.o)
      lapack_Cholesky64f(double*, unsigned long, int, double*, unsigned long, int, bool*) in libopencv_core.a(hal_internal.cpp.o)
  "_spotrf_", referenced from:
      lapack_Cholesky32f(float*, unsigned long, int, float*, unsigned long, int, bool*) in libopencv_core.a(hal_internal.cpp.o)
      lapack_Cholesky64f(double*, unsigned long, int, double*, unsigned long, int, bool*) in libopencv_core.a(hal_internal.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

有人可以告訴我如何將這兩個庫組合在一起嗎? 謝謝!

您沒有說您安裝了哪個版本的OpenCV(即版本2.x或3.x),也沒有說如何安裝(即從源代碼或使用homebrew ),也沒有說您如何構建它,也沒有顯示任何內容。代碼,因此任何答案只能是通用的。

通常,恕我直言,最簡單的方法是使用pkgconfig確定正確的包含文件路徑,庫路徑和庫。 因此,如果您使用自制軟件安裝了OpenCV版本2,則將執行以下操作以獲取包含文件路徑和庫:

pkg-config --libs --cflags opencv

樣本輸出

-I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib \
-lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching  \
-lopencv_superres -lopencv_videostab -lopencv_calib3d             \
-lopencv_features2d -lopencv_highgui -lopencv_videoio             \
-lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc \
-lopencv_flann -lopencv_core

並將其放在您的編譯命令中,如下所示:

g++ ... $(pkg-config --libs --cflags opencv) ...

如果您安裝了OpenCV 3.x ,則可能需要

pkg-config --libs --cflags opencv3

如果以其他方式安裝,則可能需要轉到從源代碼構建OpenCV的位置 ,然后找到pkgconfig文件,如下所示:

find . -name \*.pc

然后可以針對該特定文件運行pkgconfig ,如下所示:

pkg-config --libs --cflags $(find . -name \*.pc)

您可以對libtiff應用相同的邏輯。 首先,通過列出所有已知的軟件包並grepping tif找到pkgconfig用於libtiff的名稱:

pkg-config --list-all | grep -i tif

樣本輸出

libtiff-4                           libtiff - Tag Image File Format (TIFF) library.

現在,使用新發現的名稱( libtiff-4 )來獲取標志:

pkg-config --libs --cflags libtiff-4

樣本輸出

-I/usr/local/Cellar/libtiff/4.0.8/include \
-L/usr/local/Cellar/libtiff/4.0.8/lib -ltiff

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM