学习slam14讲,在wsl里配置Pangolin遇到tiff包链接不上的问题 并解决

打开文件 Pangolin/components/pango_image/CMakeLists.txt

这是原来的文件

get_filename_component(COMPONENT ${CMAKE_CURRENT_LIST_DIR} NAME) find_package(Eigen3 REQUIRED NO_MODULE) target_compile_definitions(${COMPONENT} PUBLIC HAVE_EIGEN) option(BUILD_PANGOLIN_LIBPNG "Build support for libpng image input" ON) if(BUILD_PANGOLIN_LIBPNG) find_package(PNG QUIET) if(PNG_FOUND) target_compile_definitions(${COMPONENT} PRIVATE HAVE_PNG) target_include_directories(${COMPONENT} PRIVATE ${PNG_INCLUDE_DIR} ) target_link_libraries(${COMPONENT} PRIVATE ${PNG_LIBRARY} ${ZLIB_LIBRARY}) message(STATUS "libpng Found and Enabled") endif() endif() option(BUILD_PANGOLIN_LIBJPEG "Build support for libjpeg image input" ON) if(BUILD_PANGOLIN_LIBJPEG) find_package(JPEG QUIET) if(JPEG_FOUND) target_compile_definitions(${COMPONENT} PRIVATE HAVE_JPEG) target_include_directories(${COMPONENT} PRIVATE ${JPEG_INCLUDE_DIR} ) target_link_libraries(${COMPONENT} PRIVATE ${JPEG_LIBRARY}) message(STATUS "libjpeg Found and Enabled") endif() endif() option(BUILD_PANGOLIN_LIBTIFF "Build support for libtiff image input" ON) if(BUILD_PANGOLIN_LIBTIFF) find_package(TIFF QUIET) if(TIFF_FOUND) target_compile_definitions(${COMPONENT} PRIVATE HAVE_LIBTIFF) target_link_libraries(${COMPONENT} PRIVATE TIFF::TIFF) message(STATUS "libtiff Found and Enabled") endif() endif() option(BUILD_PANGOLIN_LIBOPENEXR "Build support for libopenexr image input" ON) if(BUILD_PANGOLIN_LIBOPENEXR) find_package(OpenEXR 3 QUIET) if(OpenEXR_FOUND) target_compile_definitions(${COMPONENT} PRIVATE HAVE_OPENEXR) target_link_libraries(${COMPONENT} PRIVATE OpenEXR::OpenEXR) target_compile_options(${COMPONENT} PRIVATE $<$<OR:$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:GNU>>: -Wno-deprecated-register -Wno-deprecated> ) # https://github.com/stevenlovegrove/Pangolin/issues/677 set_target_properties(${COMPONENT} PROPERTIES CXX_STANDARD 11) message(STATUS "libopenexr Found and Enabled") endif() endif() option(BUILD_PANGOLIN_LZ4 "Build support for liblz4 compression" ON) if(BUILD_PANGOLIN_LZ4) find_package(Lz4 QUIET) if(Lz4_FOUND) target_compile_definitions(${COMPONENT} PRIVATE HAVE_LZ4) target_include_directories(${COMPONENT} PRIVATE ${Lz4_INCLUDE_DIRS} ) target_link_libraries(${COMPONENT} PRIVATE ${Lz4_LIBRARIES}) message(STATUS "liblz4 Found and Enabled") endif() endif() option(BUILD_PANGOLIN_ZSTD "Build support for libzstd compression" ON) if(BUILD_PANGOLIN_ZSTD) find_package(zstd QUIET) if(zstd_FOUND) target_compile_definitions(${COMPONENT} PRIVATE HAVE_ZSTD) target_include_directories(${COMPONENT} PRIVATE ${zstd_INCLUDE_DIR} ) target_link_libraries(${COMPONENT} PRIVATE ${zstd_LIBRARY}) message(STATUS "libzstd Found and Enabled") endif() endif() option(BUILD_PANGOLIN_LIBRAW "Build support for raw images (libraw)" ON) if(BUILD_PANGOLIN_LIBRAW) find_package(libraw QUIET) if(libraw_FOUND) target_compile_definitions(${COMPONENT} PRIVATE HAVE_LIBRAW) target_include_directories(${COMPONENT} PRIVATE ${libraw_INCLUDE_DIR} ) target_link_libraries(${COMPONENT} PRIVATE ${libraw_LIBRARIES}) message(STATUS "libraw Found and Enabled") endif() endif() target_sources( ${COMPONENT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src/pixel_format.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_exr.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_jpg.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_lz4.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_packed12bit.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_pango.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_png.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_ppm.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_raw.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_tga.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_bmp.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_zstd.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_libraw.cpp ${CMAKE_CURRENT_LIST_DIR}/src/image_io_tiff.cpp ) set_target_properties( ${COMPONENT} PROPERTIES VERSION ${PANGOLIN_VERSION} SOVERSION ${PANGOLIN_VERSION_MAJOR} ) target_link_libraries(${COMPONENT} PUBLIC pango_core Eigen3::Eigen) target_include_directories(${COMPONENT} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> $<INSTALL_INTERFACE:include> ) install(DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/include" DESTINATION ${CMAKE_INSTALL_PREFIX} )

因为这个文件专门负责pango_image组件的构建,pango_image是一个处理图像加载/保存的库,它需要 TIFF、JPEG、PNG 等库来支持各种格式。当这些库没有正确链接时,就会报 undefined reference。 所以我门只需要强制链接tiff就可以 下面是修改后的代码段

target_link_libraries(${COMPONENT} PUBLIC pango_core Eigen3::Eigen tiff)

然后再再终端运行

rm -rf build mkdir build && cd build cmake .. make -j$(nproc)