library is linked but reference is undefined
Solution 1:
when you are linking, the order of your libraries and source files makes a difference. for example for your case,
g++ -I/usr/local/cuda/include -L/usr/lib/nvidia-current -lOpenCL opencl.cpp
functions defined in the OpenCL library might not be loaded, since there nothing before them asking for a look-up. however if you use,
g++ opencl.cpp -I/usr/local/cuda/include -L/usr/lib/nvidia-current -lOpenCL
then any requests for functions will be found in the OpenCL library and they will be loaded.
Solution 2:
From the gcc
man page:
-llibrary
-l library
Search the library named library when linking. (The second alternative with the library as a separate argument is only for POSIX compliance and is not recommended.)
It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o
-lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.
The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a. The linker then uses this file as if it had been specified
precisely by name.
So try to specify the -lOpenCL
after the file argument in your compile command.
You also search for symbols in libOpenCL.so, which is a shared library file. With your command you link your program agains a static library, in the format libOpenCL.a
.