首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么链接到libOpenCL.dylib的未定义符号失败?

为什么链接到libOpenCL.dylib的未定义符号失败?
EN

Stack Overflow用户
提问于 2022-07-07 17:14:00
回答 1查看 46关注 0票数 1

我正试图在MacOS上构建pocl库

系统:

代码语言:javascript
复制
MBP 16" 2019
Intel i9, AMD Radeon 5500m
Mac OS 12.4
using bash, instead of zsh
llvm from home-brew, -version 14

我的.bash_profile中有以下内容来设置构建环境

代码语言:javascript
复制
export PATH=/usr/local/opt/llvm/bin:$PATH
export CC=clang
export CMAKE_C_COMPILER=clang
export CXX=clang++
export CMAKE_CXX_COMPILER=clang++

我用git,cd将回购复制到源目录mkdir build中。

然后在build/中运行:

cmake .. -DENABLE_TESTS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_ICD=OFF

配置似乎正常工作,然后当我运行时,就会生成,并一直运行到最后,但会给出以下错误:

代码语言:javascript
复制
[100%] Linking C executable poclcc
clang-14: warning: argument unused during compilation: '-pie' [-Wunused-command-line-argument]
Undefined symbols for architecture x86_64:
  "_clBuildProgram", referenced from:
      _main in poclcc.c.o
      _poclu_load_program_multidev in libpoclu.a(misc.c.o)
  "_clCreateCommandQueue", referenced from:
      _poclu_get_any_device2 in libpoclu.a(misc.c.o)
      _poclu_get_multiple_devices in libpoclu.a(misc.c.o)
  "_clCreateContext", referenced from:
      _main in poclcc.c.o
      _poclu_get_any_device2 in libpoclu.a(misc.c.o)
      _poclu_get_multiple_devices in libpoclu.a(misc.c.o)
  "_clCreateContextFromType", referenced from:
      _poclu_create_any_context in libpoclu.a(misc.c.o)
  "_clCreateProgramWithBinary", referenced from:
      _poclu_load_program_multidev in libpoclu.a(misc.c.o)
  "_clCreateProgramWithIL", referenced from:
      _poclu_load_program_multidev in libpoclu.a(misc.c.o)
  "_clCreateProgramWithSource", referenced from:
      _main in poclcc.c.o
      _poclu_load_program_multidev in libpoclu.a(misc.c.o)
  "_clGetDeviceIDs", referenced from:
      _main in poclcc.c.o
      _poclu_get_any_device2 in libpoclu.a(misc.c.o)
      _poclu_get_multiple_devices in libpoclu.a(misc.c.o)
  "_clGetDeviceInfo", referenced from:
      _main in poclcc.c.o
      _poclu_load_program_multidev in libpoclu.a(misc.c.o)
  "_clGetPlatformIDs", referenced from:
      _main in poclcc.c.o
      _poclu_create_any_context in libpoclu.a(misc.c.o)
      _poclu_get_any_device2 in libpoclu.a(misc.c.o)
      _poclu_get_multiple_devices in libpoclu.a(misc.c.o)
  "_clGetProgramBuildInfo", referenced from:
      _main in poclcc.c.o
      _poclu_show_program_build_log in libpoclu.a(misc.c.o)
  "_clGetProgramInfo", referenced from:
      _main in poclcc.c.o
      _poclu_show_program_build_log in libpoclu.a(misc.c.o)
  "_clReleaseContext", referenced from:
      _main in poclcc.c.o
  "_clReleaseProgram", referenced from:
      _main in poclcc.c.o
ld: symbol(s) not found for architecture x86_64

我检查并成功地在libOpenCL.dylib目录中构建了pocl/build/lib/CL/。作为检查,我尝试使用指向这个库的直接链接编译clinfo,它给了我相同的错误消息集,如上面所示。

运行nm libOpenCL.dylib | grep clBuildProgram会打印以下内容:

0000000000013850 t _clBuildProgram

因此,它在那里,但它是一个本地文本部分的符号。我真的不知道这意味着什么,但是,如果这意味着它应该工作,或不应该工作。我真的不明白这里的问题是什么,为什么这个链接失败,或者如何处理它。想找些关于这方面的指导。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-08 14:54:45

小写t的意思是符号是局部的,即对链接程序来说是不可外部可见的。大写T在外部是可见的。

POCL有许多配置选项,并不是所有的配置选项都记录在文档的Build部分。默认情况下,VISIBILITY_HIDDEN选项是打开的,除非ENABLE_PROXY选项是打开的。

build/中,运行:

cmake .. -DENABLE_ICD=OFF -DVISIBILITY_HIDDEN=OFF

然后:

make

编译成功到最后。然后在build/lib/CL/中运行:

nm libOpenCL.dylib | grep clBuildProgram

现在打印:

0000000000013790 T _clBuildProgram

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72901883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档