it-swarm-id.com

perpustakaan ditautkan tetapi referensi tidak ditentukan

Saya mencoba mengkompilasi program openCL di Ubuntu dengan kartu NVIDIA yang pernah bekerja sebelumnya,

#include <CL/cl.h>
#include <iostream>
#include <vector>

using namespace std;

int main() {
  cl_platform_id platform;
  cl_device_id device;
  cl_context context;
  cl_command_queue command_queue;
  cl_int error;

  if(clGetPlatformIDs(1, &platform, NULL) != CL_SUCCESS) {
    cout << "platform error" << endl;
  }

  if(clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL) != CL_SUCCESS) {
    cout << "device error" << endl;
  }

  context = clCreateContext(NULL, 1, &device, NULL, NULL, &error);
  if(error != CL_SUCCESS) {
    cout << "context error" << endl;
  }

  command_queue = clCreateCommandQueue(context, device, 0, &error);
  if(error != CL_SUCCESS) {
    cout << "command queue error" << endl;
  }

  return 0;
}

Saya kompilasi seperti itu,

g++ -I/usr/local/cuda/include -L/usr/lib/nvidia-current -lOpenCL opencl.cpp

dan saya mendapatkan hasil ini

/tmp/ccAdS9ig.o: In function `main':
opencl.cpp:(.text+0x1a): undefined reference to `clGetPlatformIDs'
opencl.cpp:(.text+0x3d): undefined reference to `clGetDeviceIDs'
opencl.cpp:(.text+0x65): undefined reference to `clCreateContext'
opencl.cpp:(.text+0x85): undefined reference to `clCreateCommandQueue'
collect2: ld returned 1 exit status

tapi nm -D /usr/lib/nvidia-current/libOpenCL.so memberi tahu saya bahwa libOpenCL.so setidaknya mengandung clGetPlatformIDs

0000000000002400 T clGetKernelWorkGroupInfo
0000000000002140 T clGetMemObjectInfo
0000000000002e80 T clGetPlatformIDs
0000000000002de0 T clGetPlatformInfo
0000000000002310 T clGetProgramBuildInfo
00000000000022f0 T clGetProgramInfo
00000000000021f0 T clGetSamplerInfo

Apakah saya melewatkan sesuatu.

30
user615457

Dari halaman manual gcc:

   -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.

Jadi cobalah untuk menentukan -lOpenCL setelah argumen file dalam perintah kompilasi Anda.

Anda juga mencari simbol di libOpenCL.so, yang merupakan file perpustakaan bersama. Dengan perintah Anda, Anda menautkan program Anda dengan pustaka statis, dalam format libOpenCL.a.

24
Geoffroy

ketika Anda menautkan, urutan perpustakaan dan file sumber membuat perbedaan. misalnya untuk kasus Anda,

g ++ -I/usr/local/cuda/termasuk -L/usr/lib/nvidia-current -lOpenCL opencl.cpp

fungsi yang didefinisikan di pustaka OpenCL mungkin tidak dimuat, karena tidak ada sebelum mereka meminta pencarian. namun jika Anda menggunakan,

g++ opencl.cpp -I/usr/local/cuda/include -L/usr/lib/nvidia-current -lOpenCL  

maka setiap permintaan untuk fungsi akan ditemukan di perpustakaan OpenCL dan mereka akan dimuat.

29
user995502

Atau Anda dapat menambahkan jalur tajuk dan pustaka ke variabel global Anda.

export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/cuda/include
export LIBRARY_PATH=$LIBRARY_PATH:/usr/lib/nvidia-current

Anda juga dapat mencoba mengatur

export PATH=$PATH:/usr/local/cuda/bin

Seharusnya mungkin dijalankan sekarang

g++ opencl.cpp
0
Jesse