Linker 动态链接:如何忽略版本标记?

Linker 动态链接:如何忽略版本标记?,linker,ld,Linker,Ld,我想编译一个OpenCL程序,它使用clAmdFFT,AMDs OpenCL FFT,这是一个封闭源代码 $ objdump -x libclAmdFft.Runtime.so Dynamic Section: NEEDED libOpenCL.so.1 Version References: required from libOpenCL.so.1: 0x028568b0 0x00 05 OPENCL_1.0 在一台机器上,我使用的是AMD驱动程序

我想编译一个OpenCL程序,它使用clAmdFFT,AMDs OpenCL FFT,这是一个封闭源代码

$ objdump -x libclAmdFft.Runtime.so
Dynamic Section:
  NEEDED               libOpenCL.so.1
Version References:
  required from libOpenCL.so.1:
    0x028568b0 0x00 05 OPENCL_1.0
在一台机器上,我使用的是AMD驱动程序,它附带了一个libOpenCL。因此,它包含了版本信息,如下所示:

a$ objdump -T /opt/AMDAPP/lib/x86_64/libOpenCL.so
0000000000002610 g    DF .text  0000000000000018  OPENCL_1.0  clGetSamplerInfo
00000000000032e0 g    DF .text  0000000000000018  OPENCL_1.1  clSetEventCallback
0000000000002350 g    DF .text  0000000000000018  OPENCL_1.2  clCreateSubDevices
b$ objdump -T /usr/lib/libOpenCL.so # -> /usr/lib/nvidia-current/libOpenCL.so
00000000000021f0 g    DF .text  0000000000000018  Base        clGetSamplerInfo
0000000000002a40 g    DF .text  0000000000000018  Base        clSetEventCallback
这台机器一切正常

另一台机器,我使用英伟达驱动程序,它带有一个LIB OpenCL。因此不包括版本信息,例如:

a$ objdump -T /opt/AMDAPP/lib/x86_64/libOpenCL.so
0000000000002610 g    DF .text  0000000000000018  OPENCL_1.0  clGetSamplerInfo
00000000000032e0 g    DF .text  0000000000000018  OPENCL_1.1  clSetEventCallback
0000000000002350 g    DF .text  0000000000000018  OPENCL_1.2  clCreateSubDevices
b$ objdump -T /usr/lib/libOpenCL.so # -> /usr/lib/nvidia-current/libOpenCL.so
00000000000021f0 g    DF .text  0000000000000018  Base        clGetSamplerInfo
0000000000002a40 g    DF .text  0000000000000018  Base        clSetEventCallback
将程序链接到
-llibOpenCL.so-llibclamdft.Runtime.so
失败,因为clAmdFft希望链接到标记的符号:

libclAmdFftRuntime.so: undefinded reference to `clCreateBuffer@OPENCL_1.0`
动态链接器还生成此投诉:

b$ ldd libclAmdFft.Runtime.so
libclAmdFft.Runtime.so: …/libOpenCL.so.1: no version information available …
由于英伟达驱动程序实现OpenCL 1.1和AMDFFT只需要1,如果我能说服它,代码< > BASE= OpenCL1.1.0/COD>,它应该工作。可能吗

我不能强迫nVidia用户安装另一个版本,因为libOpenCL是驱动程序的一部分,就像libGL一样


在共享libs中链接
--unresolved symbols=ignore成功,但生成的二进制文件再也找不到FFT库


由于OpenCL将依赖于设备的部分拆分为ICD库,因此如果我从AMD驱动程序提供libOpenCL.so,即使在nVidia机器上,它也会工作,在nVidia机器上,它会从/etc/OpenCL/vendors/nVidia.ICD动态加载正确的ICD,但我不确定这是否是可移植的,例如,目录是硬编码的