我正在尝试在 Docker 文件中编译一个项目,但它不断抛出错误。
Docker 文件:
FROM jjanzic/docker-python3-opencv:contrib-opencv-3.4.2
RUN apt-get update -y
RUN apt-get install -y g++ cmake libboost-dev libgoogle-perftools-dev
COPY . /opt/nsg
WORKDIR /opt/nsg
RUN mkdir -p build && cd build && \
cmake -DCMAKE_BUILD_TYPE=Release .. && \
make -j $(nproc)
CMakeLists.txt 根目录:
cmake_minimum_required(VERSION 2.8)
project(efanna2e)
include_directories(${PROJECT_SOURCE_DIR}/include)
find_package(OpenCV REQUIRED)
#OpenMP
find_package(OpenMP)
if (OPENMP_FOUND)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
else()
message(FATAL_ERROR "no OpenMP supprot")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
add_definitions (-std=c++14 -O3 -lboost -march=native -Wall -DINFO)
add_subdirectory(src)
add_subdirectory(tests)
CMakeLists.txt 在 /tests
目录:
set(CMAKE_CXX_STANDARD 14)
add_executable(test_nsg_index test_nsg_index.cpp)
target_link_libraries(test_nsg_index ${PROJECT_NAME} -ltcmalloc)
add_executable(test_nsg_search test_nsg_search.cpp)
target_link_libraries(test_nsg_search ${PROJECT_NAME})
add_executable(test_nsg_optimized_search test_nsg_optimized_search.cpp)
target_link_libraries(test_nsg_optimized_search ${OpenCV_LIBS})
target_link_libraries(test_nsg_optimized_search ${PROJECT_NAME} -ltcmalloc)
我要运行的代码:
auto body = req.body.substr(file.offset, file.length);
const cv::Mat image = cv::imdecode(body, 0);
运行后docker build .
这是输出的一部分:
-- Found OpenCV: /usr/local (found version "3.4.2")
/opt/nsg/tests/test_nsg_optimized_search.cpp:149:4: required from here
/opt/nsg/tests/test_nsg_optimized_search.cpp:145:39: error: no matching function for call to ‘imdecode(std::__cxx11::basic_string<char>&, int)’
const cv::Mat image = cv::imdecode(body, 0);
~~~~~~~~~~~~^~~~~~~~~
In file included from /usr/local/include/opencv2/imgcodecs/imgcodecs.hpp:48:0,
from /opt/nsg/tests/test_nsg_optimized_search.cpp:12:
/usr/local/include/opencv2/imgcodecs.hpp:222:18: note: candidate: cv::Mat cv::imdecode(cv::InputArray, int)
CV_EXPORTS_W Mat imdecode( InputArray buf, int flags );
^~~~~~~~
所以一直说没有函数imdecode
.我也试过imread
和其他多项功能。它只是一直说它不存在,在下一行它说它找到了我想要的函数并指向它。
我在我的代码中尝试了很多东西:
- 我加载了
#include <opencv2/core/core.hpp>
- 然后我加载了
#include "opencv2/core/core.hpp"
(对来自 opencv 的所有包含的 hpp 文件都这样做了 - 已使用:
using namespace cv;
- 使用了没有命名空间的函数
- 做了:
cv::imdecode()
- 做了:
imdecode()
这些全部导致了同样的错误。
昨天我在一台 Ubuntu 18.04 机器上遇到了同样的问题,只是我在机器上安装了 opencv 而不是通过 Docker。今天重装Ubuntu到16.04版本,开始使用Docker。但同样的问题。我想我在这里做错了什么,但不知道是什么。
最佳答案
错误告诉你函数调用:
const cv::Mat image = cv::imdecode(body, 0);
与头文件中定义的不匹配。编译器只知道如何使用与定义的函数签名(即函数名称、函数参数类型、返回类型等)相匹配的调用,在您的例子中为 imgcodecs.hpp
:
cv::Mat cv::imdecode(cv::InputArray, int)
编译器将此称为候选 匹配,因为虽然您使用的函数名称是imdecode
, 是正确的,函数参数 types 不匹配。您的函数调用具有此签名(根据错误消息),表明第一个参数与编译器期望的不同:
cv::Mat imdecode(std::__cxx11::basic_string<char>&, int)
所以你必须改变变量body
成为cv::InputArray
类型,或来自 InputArray
的类型可以构造。可能性列表是 here .考虑一个 cv::InputArray
可以从 std::vector<T>
构建类型,您可以尝试转换 body
进入 vector char
像这样:
auto body = req.body.substr(file.offset, file.length);
std::vector<char> bodyVector(body.begin(), body.end());
const cv::Mat image = cv::imdecode(bodyVector, 0);
或者您可以显式创建一个 cv::InputArray
来自 body
的变量并将其传递给 imdecode
函数代替。
关于c++ - Opencv 链接 CMAKE 不工作 Ubuntu 16.04 Docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57433037/