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: 's avatarRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>
parent 179ef0a9
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment