ocl: Fix OpenCL library detection in Linux

OpenCL runtime does not require OpenCL development file (libOpenCL.so),
just the "run" library (so.1).

This patch searches for the run library (so.1) if the dev library (.so)
is not found.

Web search shows that this error has been present since at least 2015
http://answers.opencv.org/question/80532/haveopencl-return-false/

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
pull/9449/head
Ricardo Ribalda Delgado 8 years ago
parent 179ef0a975
commit 6fc5697950
  1. 32
      modules/core/src/opencl/runtime/opencl_core.cpp

@ -134,6 +134,24 @@ static void* WinGetProcAddress(const char* name)
#include <dlfcn.h>
#include <stdio.h>
static void *GetHandle(const char *file)
{
void *handle;
handle = dlopen(file, RTLD_LAZY | RTLD_GLOBAL);
if (!handle)
return NULL;
if (dlsym(handle, OPENCL_FUNC_TO_CHECK_1_1) == NULL)
{
fprintf(stderr, ERROR_MSG_INVALID_VERSION);
dlclose(handle);
return NULL;
}
return handle;
}
static void* GetProcAddress(const char* name)
{
static bool initialized = false;
@ -143,20 +161,18 @@ static void* GetProcAddress(const char* name)
cv::AutoLock lock(cv::getInitializationMutex());
if (!initialized)
{
const char* path = "libOpenCL.so";
const char* envPath = getenv("OPENCV_OPENCL_RUNTIME");
if (envPath)
path = envPath;
handle = dlopen(path, RTLD_LAZY | RTLD_GLOBAL);
if (handle == NULL)
{
if (envPath)
handle = GetHandle(envPath);
if (!handle)
fprintf(stderr, ERROR_MSG_CANT_LOAD);
}
else if (dlsym(handle, OPENCL_FUNC_TO_CHECK_1_1) == NULL)
else
{
fprintf(stderr, ERROR_MSG_INVALID_VERSION);
handle = NULL;
handle = GetHandle("libOpenCL.so");
if (!handle)
handle = GetHandle("libOpenCL.so.1");
}
initialized = true;
}

Loading…
Cancel
Save