0

I have my library libOCL_GridFF.so which depends on libOpenCL.so and libclFFT.so. I try to compile it using CMake like this:

find_package( OpenCL REQUIRED )
find_package( clFFT  REQUIRED )
add_library(OCL_GridFF  SHARED OCL_GridFF.cpp ${OPENCL_LIBRARY} ${clFFT_LIBRARY} )

but it does not seem to include any dependence to the libraries (libOpenCL.so and libclFFT.so)

prokophapala@ProkopDesktop:~/git/FireCore/cpp/Build_OCL/libs_OCL$ ldd libOCL_GridFF.so 
    linux-vdso.so.1 (0x00007ffef5546000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff4ae84c000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff4ae765000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff4ae745000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff4ae51d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ff4aeaac000)

Then when I try to load the library with python like this

lib  = ct.CDLL(  "../../cpp/Build_OCL/libs_OCL/libOCL_GridFF.so", ct.RTLD_LOCAL )

it throws errors:

OSError: ../../cpp/Build_OCL/libs_OCL/libOCL_GridFF.so: undefined symbol: clBuildProgram

and really these symbols are undefined:

prokophapala@ProkopDesktop:~/git/FireCore/cpp/Build_OCL/libs_OCL$ ld libOCL_GridFF.so
ld: warning: cannot find entry symbol _start; not setting start address
ld: libOCL_GridFF.so: undefined reference to `clBuildProgram'
ld: libOCL_GridFF.so: undefined reference to `clEnqueueNDRangeKernel'
ld: libOCL_GridFF.so: undefined reference to `clSetKernelArg'
ld: libOCL_GridFF.so: undefined reference to `clEnqueueCopyBufferToImage'
ld: libOCL_GridFF.so: undefined reference to `clReleaseMemObject'
ld: libOCL_GridFF.so: undefined reference to `clFinish'
ld: libOCL_GridFF.so: undefined reference to `clfftSetResultLocation'
ld: libOCL_GridFF.so: undefined reference to `clReleaseContext'
ld: libOCL_GridFF.so: undefined reference to `clfftSetPlanPrecision'
ld: libOCL_GridFF.so: undefined reference to `clfftCreateDefaultPlan'
ld: libOCL_GridFF.so: undefined reference to `clEnqueueWriteBuffer'
ld: libOCL_GridFF.so: undefined reference to `clEnqueueCopyBuffer'
ld: libOCL_GridFF.so: undefined reference to `clEnqueueReadBuffer'
ld: libOCL_GridFF.so: undefined reference to `clfftBakePlan'
ld: libOCL_GridFF.so: undefined reference to `clGetProgramBuildInfo'
ld: libOCL_GridFF.so: undefined reference to `clfftSetup'
ld: libOCL_GridFF.so: undefined reference to `clCreateContext'
ld: libOCL_GridFF.so: undefined reference to `clCreateImage3D'
ld: libOCL_GridFF.so: undefined reference to `clGetDeviceIDs'
ld: libOCL_GridFF.so: undefined reference to `clGetDeviceInfo'
ld: libOCL_GridFF.so: undefined reference to `clReleaseCommandQueue'
ld: libOCL_GridFF.so: undefined reference to `clGetPlatformIDs'
ld: libOCL_GridFF.so: undefined reference to `clCreateCommandQueue'
ld: libOCL_GridFF.so: undefined reference to `clfftEnqueueTransform'
ld: libOCL_GridFF.so: undefined reference to `clfftSetLayout'
ld: libOCL_GridFF.so: undefined reference to `clReleaseProgram'
ld: libOCL_GridFF.so: undefined reference to `clCreateKernel'
ld: libOCL_GridFF.so: undefined reference to `clCreateBuffer'
ld: libOCL_GridFF.so: undefined reference to `clCreateProgramWithSource'
ld: libOCL_GridFF.so: undefined reference to `clReleaseKernel'
ld: libOCL_GridFF.so: undefined reference to `clCreateImage2D'

============= For Comparison =========

When I compile the same library using my hand-written Makefile, it works

FFLAGS="-Werror -Wno-write-strings -Wno-reorder -Wno-deprecated-declarations -Wno-unused-variable"
g++ -c -Wall -fpic $FFLAGS -o libOCL_GridFF.o libOCL_GridFF.cpp
g++ -shared -o libOCL_GridFF.so libOCL_GridFF.o -lOpenCL -lclFFT

this manually compiled version of the library works just fine in python.

it also show the proper dependencies:

prokophapala@ProkopDesktop:~/git/FireCore/pyOCL/cpp_build$ ldd libOCLfft.so
    linux-vdso.so.1 (0x00007ffc607d5000)
    libOpenCL.so.1 => /lib/x86_64-linux-gnu/libOpenCL.so.1 (0x00007f0a386ec000)
    libclFFT.so.2 => /lib/x86_64-linux-gnu/libclFFT.so.2 (0x00007f0a3861a000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0a383ee000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0a38307000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0a382e7000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0a380bd000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f0a3875a000)
Prokop Hapala
  • 2,424
  • 2
  • 30
  • 59
  • 1
    Linking with an existing library is performed by `target_link_libraries` command, not by adding the library into `add_library` call. – Tsyvarev Sep 16 '22 at 10:36

0 Answers0