1.添加两个编译选项
/usr/include/OpenEXR/half.h:121:13: note: because ‘half’ has user-provided ‘half& half::operator=(half)’
121 | half & operator = (half h);
| ^~~~~~~~
解决方案:
在CMakeList中添加以下两句:
set_property(TARGET ${COMPONENT} PROPERTY CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy -Wno-error=deprecated-copy")
完整CMakeList.txt的如下:
cmake_minimum_required(VERSION 3.16)
project("Pangolin")
set(PANGOLIN_VERSION_MAJOR 0)
set(PANGOLIN_VERSION_MINOR 9)
set(PANGOLIN_VERSION_PATCH 3)
set_property(TARGET ${COMPONENT} PROPERTY CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy -Wno-error=deprecated-copy")
set(PANGOLIN_VERSION ${PANGOLIN_VERSION_MAJOR}.${PANGOLIN_VERSION_MINOR}.${PANGOLIN_VERSION_PATCH})
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
# Prevent in source builds
if(EXISTS "${PROJECT_BINARY_DIR}/CMakeLists.txt")
message(FATAL_ERROR "Source build detected: please use a subdir. You may remove 'CMakeCache.txt' and 'CMakeFiles'.")
endif()
# Make our own cmake imports accessible
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
SET(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
include(SetPlatformVars)
include(PangolinFactory)
option( BUILD_TOOLS "Build Tools" ON )
option( BUILD_EXAMPLES "Build Examples" ON )
option( BUILD_ASAN "Enable AddressSanitizer for Debug builds" OFF )
# Default build type (Override with cmake .. -DCMAKE_BUILD_TYPE=...)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
message(STATUS "Setting build type to '${CMAKE_BUILD_TYPE}' as none was specified.")
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()
option( BUILD_SHARED_LIBS "Build Shared Library" ON)
if(_WIN_)
option( MSVC_USE_STATIC_CRT "Use static C Runtime with MSVC, /MT instead of /MD" ON)
# Make sure there are no erroneous C Runtime flags
list(APPEND FLAG_VARS
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
)
if(MSVC_USE_STATIC_CRT)
foreach(FLAG_VAR ${FLAG_VARS})
string(REGEX REPLACE "/MD" "/MT" NEW_FLAGS "${${FLAG_VAR}}")
set(${FLAG_VAR} "${NEW_FLAGS}" CACHE STRING "" FORCE)
endforeach()
else()
foreach(FLAG_VAR ${FLAG_VARS})
string(REGEX REPLACE "/MT" "/MD" NEW_FLAGS "${${FLAG_VAR}}")
set(${FLAG_VAR} "${NEW_FLAGS}" CACHE STRING "" FORCE)
endforeach()
endif()
elseif(_OSX_)
set(CMAKE_MACOSX_RPATH ON)
elseif(EMSCRIPTEN)
set(BUILD_SHARED_LIBS OFF)
include(EmscriptenUtils)
set(CMAKE_EXE_LINKER_FLAGS "-sASYNCIFY=1 -sDISABLE_EXCEPTION_CATCHING=0 -sGL_ASSERTIONS=1 -sFULL_ES3=1 --bind")
endif()
# run with "ASAN_OPTIONS=fast_unwind_on_malloc=0" to print stack with more details
if(BUILD_ASAN)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} \
-fsanitize=address \
-fsanitize=bool \
-fsanitize=bounds \
-fsanitize=enum \
-fsanitize=float-cast-overflow \
-fsanitize=float-divide-by-zero \
-fsanitize=nonnull-attribute \
-fsanitize=returns-nonnull-attribute \
-fsanitize=signed-integer-overflow \
-fsanitize=undefined \
-fsanitize=vla-bound \
-fno-sanitize=alignment \
-fsanitize=leak \
-fsanitize=object-size \
")
endif()
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Werror)
# error: ISO C++ prohibits anonymous structs
# add_compile_options(-Wpedantic)
# ignore "parentheses" warning for custom "picojson" fork
add_compile_options(-Wno-parentheses)
add_compile_options(-Wno-null-pointer-arithmetic)
add_compile_options(-Wno-null-pointer-subtraction)
if(CMAKE_COMPILER_IS_GNUCC)
add_compile_options(-Werror=maybe-uninitialized)
endif()
endif()
#######################################################
## Testing setup
option(BUILD_TESTS "Build Tests" OFF)
if(BUILD_TESTS)
find_package(Catch2 REQUIRED)
include(CTest)
include(Catch)
endif()
#######################################################
## Add all pangolin components
file(GLOB components_cmake "${CMAKE_CURRENT_LIST_DIR}/components/*/CMakeLists.txt")
set(component_list "")
foreach(component_cmake ${components_cmake})
get_filename_component(component_dir ${component_cmake} DIRECTORY)
get_filename_component(component_name ${component_dir} NAME)
add_library(${component_name} "")
list(APPEND component_list ${component_name})
endforeach()
foreach(component_cmake ${components_cmake})
include(${component_cmake})
endforeach()
#######################################################
## Build Tree Export
# Export Targets
export(TARGETS ${component_list} FILE PangolinTargets.cmake)
export(PACKAGE Pangolin)
# Version information
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" @ONLY)
# Build tree config
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY IMMEDIATE )
#######################################################
## Install headers / targets
include(GNUInstallDirs)
# This relative path allows installed files to be relocatable.
set( CMAKECONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} )
file( RELATIVE_PATH REL_INCLUDE_DIR
"${CMAKE_INSTALL_PREFIX}/${CMAKECONFIG_INSTALL_DIR}"
"${CMAKE_INSTALL_PREFIX}/include"
)
install(
TARGETS ${component_list}
EXPORT ${PROJECT_NAME}Targets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
DESTINATION ${CMAKECONFIG_INSTALL_DIR}
)
install(
EXPORT ${PROJECT_NAME}Targets DESTINATION ${CMAKECONFIG_INSTALL_DIR}
)
# uninstall target
if(NOT TARGET uninstall)
configure_file(
"${CMAKE_CURRENT_LIST_DIR}/cmake/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
#######################################################
## Tools / Examples
set(Pangolin_DIR ${CMAKE_CURRENT_BINARY_DIR})
if(BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
if(BUILD_TOOLS)
add_subdirectory(tools)
endif()
2.修改C++版本:
/home/and/work/lidar2camera/manual_calib/Pangolin/components/pango_opengl/src/glfont.cpp:125:26: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
125 | vsnprintf(result.data(), len+1, format, args);
| ~~~~~~~~~~~^~
| |
| const char*
/usr/include/x86_64-linux-gnu/bits/stdio2.h:77:1: note: initializing argument 1 of ‘int vsnprintf(char*, size_t, const char*, __va_list_tag*)’
77 | __NTH (vsnprintf (char *__restrict __s, size_t __n,
| ^~~~~
/home/and/work/lidar2camera/manual_calib/Pangolin/components/pango_opengl/src/glfont.cpp:197:22: error: ‘class std::map<unsigned int, pangolin::GlChar>’ has no member named ‘try_emplace’; did you mean ‘emplace’?
197 | chardata.try_emplace(codepoint, tex_w,tex_h, x, y, gw, gh, scale*advance, x0 -0.5f, -y0 -0.5f);
| ^~~~~~~~~~~
| emplace
At global scope:
解决方法:
set(CMAKE_CXX_STANDARD 11) 改为set(CMAKE_CXX_STANDARD 17)
3.设置全局变量
/home/and/work/lidar2camera/manual_calib/Pangolin/components/pango_python/src/pyinterpreter.cpp:61:27: error: ‘py::module_’ has not been declared
61 | auto pypangolin = py::module_::import("pypangolin");
| ^~~~~~~
/home/and/work/lidar2camera/manual_calib/Pangolin/components/pango_python/src/pyinterpreter.cpp:63:20: error: ‘py::module_’ has not been declared
63 | auto sys = py::module_::import("sys");
| ^~~~~~~
At global scope:
解决方法:
sudo pip3 install "pybind11[global]"
4.修改install_prerequisites.sh文件
E: 无法定位软件包 catch2
这个包是22.04的中用来测试的,20.04里没有,在install_prerequisites.sh文件中删除就好,下面提供一个删除后完整的install_prerequisites.sh文件:
#!/bin/bash
# exit when any command fails
set -e
MANAGERS=(dnf apt port vcpkg brew pacman)
MANAGER=""
LIST=0
VERBOSE=0
DRYRUN=0
UPDATE=0
REQUIRED_RECOMMENDED_ALL=1
SUDO=""
PKGS_UPDATE=""
PKGS_REQUIRED=()
PKGS_RECOMMENDED=()
PKGS_ALL=()
PKGS_OPTIONS=()
# Parse Command line
PARAMS=""
while (( "$#" )); do
case "$1" in
-v|--verbose)
VERBOSE=1
shift
;;
-d|--dry-run)
DRYRUN=1
shift
;;
-l|--list)
LIST=1
shift
;;
-u|--update-package-list)
UPDATE=1
shift
;;
-m|--package-manager)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
MANAGER=($2)
shift 2
else
echo "Error: Argument for $1 is missing" >&2
exit 1
fi
;;
-h|--help)
echo "$0 [-vh] [-m package-manager-list] [required|recommended|all]"
echo " -m, --package-manager: preferred package manager order (default: \"${MANAGERS[*]}\")"
echo " -v, --verbose: verbose output"
echo " -d, --dry-run: print actions, but do not execute"
echo " -l, --list: just list the packages to install"
echo " -u, --update-package-list: update package manager package list"
echo " -h, --help: this help message"
echo " (required|recommended|all) the set of dependencies to select."
exit 0
;;
-*|--*=) # unsupported flags
echo "Error: Unsupported flag $1" >&2
exit 1
;;
*) # preserve positional arguments
PARAMS="$1"
shift
;;
esac
done
# Make lower case
PARAMS=$(echo "$PARAMS" | tr '[:upper:]' '[:lower:]' | tr -s "[:blank:]")
# Work out which set of dependencies we're installing
case "$PARAMS" in
required)
REQUIRED_RECOMMENDED_ALL=0
if ((VERBOSE > 0)); then echo "Selecting required dependencies only."; fi
;;
""|recommended)
REQUIRED_RECOMMENDED_ALL=1
if ((VERBOSE > 0)); then echo "Selecting required+recommended dependencies."; fi
;;
all)
REQUIRED_RECOMMENDED_ALL=2
if ((VERBOSE > 0)); then echo "Selecting all available dependencies."; fi
;;
*)
echo "Unrecognized positional argument \"$PARAMS\". Expecting one of (required,recommended [default],all)"
exit 1
;;
esac
# Find an available package manager from the preferred list
# if one has not already been selected manually.
if [ -z "$MANAGER" ]
then
for m in ${MANAGERS[@]}
do
if [ -x "$(command -v $m)" ]; then
MANAGER="$m"
break
fi
done
fi
# If no package manager is found, exit
if [ -z "$MANAGER" ]
then
echo "Error: No preferred package managers from list [${MANAGERS[*]}] found. Use -m to select manually." >&2
exit 1
fi
if ((VERBOSE > 0)); then echo "Using \"$MANAGER\" package manager (select another using -m)"; fi
# Setup prereq commands and packages.
if [[ "$MANAGER" == "apt" ]]; then
SUDO="sudo"
PKGS_UPDATE="apt update"
PKGS_OPTIONS+=(install --no-install-suggests --no-install-recommends)
if ((DRYRUN > 0)); then PKGS_OPTIONS+=(--dry-run); SUDO=""; fi
PKGS_REQUIRED+=(libgl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols libegl1-mesa-dev)
PKGS_REQUIRED+=(libc++-dev libepoxy-dev libglew-dev libeigen3-dev cmake g++ ninja-build)
PKGS_RECOMMENDED+=(libjpeg-dev libpng-dev)
PKGS_RECOMMENDED+=(libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libavdevice-dev)
PKGS_ALL+=(libdc1394-dev libraw1394-dev libopenni-dev python3-dev)
elif [[ "$MANAGER" == "dnf" ]]; then
SUDO="sudo"
PKGS_UPDATE="dnf check-update"
PKGS_OPTIONS+=(install)
PKGS_REQUIRED+=(wayland-devel libxkbcommon-devel g++ ninja-build)
PKGS_REQUIRED+=(epoxy-devel eigen3 cmake)
PKGS_RECOMMENDED+=(libjpeg-devel libpng-devel OpenEXR-devel )
PKGS_ALL+=(libdc1394-devel libraw1394-devel librealsense-devel openni-devel)
if ((DRYRUN > 0)); then
MANAGER="echo $MANAGER"
SUDO=""
fi
elif [[ "$MANAGER" == "pacman" ]]; then
SUDO="sudo"
PKGS_UPDATE="" # databases and packages are updated in -Syu install options
PKGS_OPTIONS+=(-Syu --needed)
PKGS_REQUIRED+=(mesa wayland libxkbcommon wayland-protocols libc++ glew eigen cmake gcc ninja)
PKGS_RECOMMENDED+=(libjpeg-turbo libpng ffmpeg)
PKGS_ALL+=(libdc1394 libraw1394 openni python3)
if ((DRYRUN > 0)); then
MANAGER="echo $MANAGER"
SUDO=""
fi
elif [[ "$MANAGER" == "port" ]]; then
SUDO="sudo"
PKGS_UPDATE="port sync -q"
if ((DRYRUN > 0)); then PKGS_OPTIONS+=(-y); SUDO=""; fi
PKGS_OPTIONS+=(-N install -q)
PKGS_REQUIRED+=(glew eigen3-devel cmake +gui ninja)
PKGS_RECOMMENDED+=(libjpeg-turbo libpng openexr tiff ffmpeg-devel lz4 zstd py37-pybind11 )
PKGS_ALL+=(libdc1394 openni)
elif [[ "$MANAGER" == "brew" ]]; then
PKGS_OPTIONS+=(install)
if ((VERBOSE > 0)); then PKGS_OPTIONS+=(--verbose); fi
PKGS_REQUIRED+=(glew eigen cmake ninja)
PKGS_RECOMMENDED+=(libjpeg-turbo libpng openexr libtiff ffmpeg lz4 zstd python-setuptools)
# Brew doesn't have a dryrun option
if ((DRYRUN > 0)); then
MANAGER="echo $MANAGER"
fi
elif [[ "$MANAGER" == "vcpkg" ]]; then
# TODO: this should be a config option somehow...
PKGS_OPTIONS+=(install --triplet=x64-windows )
if ((DRYRUN > 0)); then PKGS_OPTIONS+=(--dry-run); fi
PKGS_REQUIRED+=(glew eigen3 vcpkg-tool-ninja)
PKGS_RECOMMENDED+=(libjpeg-turbo libpng openexr tiff ffmpeg lz4 zstd python3 )
PKGS_ALL+=(openni2 realsense2)
else
echo "Error: Don't know how to use \"$MANAGER\", please fix the script." >&2
exit 1
fi
if ((REQUIRED_RECOMMENDED_ALL < 2)); then PKGS_ALL=(); fi
if ((REQUIRED_RECOMMENDED_ALL < 1)); then PKGS_RECOMMENDED=(); fi
PACKAGES=( "${PKGS_REQUIRED[*]}" "${PKGS_RECOMMENDED[*]}" "${PKGS_ALL[*]}" )
if ((LIST > 0)); then
echo "${PACKAGES[*]}"
exit 0
fi
if ((UPDATE > 0)); then
if ((VERBOSE > 0)); then echo "Requesting \"$MANAGER\" package update."; fi
$SUDO $PKGS_UPDATE
fi
if ((VERBOSE > 0)); then echo "Requesting install of: ${PACKAGES[*]}"; fi
# Install
$SUDO $MANAGER ${PKGS_OPTIONS[*]} ${PACKAGES[*]}