[英]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.