链接时提示vkCreateXlibSurfaceKHR未定义但动态库存在该符号如何解决
问题根因
你在libdrivers.linuxbsd.tools.64.so中看到的vkCreateXlibSurfaceKHR符号是本地非导出符号:nm输出中使用小写的b标识,代表该符号位于本地BSS段,不会被共享库导出到动态符号表,因此链接可执行程序时,外部目标文件无法解析到这个符号。
为什么会出现这个情况
- 你使用的Volk是Vulkan的动态加载库,所有Vulkan API函数本质上都是Volk定义的全局函数指针变量。你编译
volk.c时产生的C段符号属于「暂定定义(tentative definition)」:这种未显式初始化的全局变量,在链接为共享库时如果没有找到其他强定义,会被默认合并到BSS段。 - 编译共享库时默认的符号可见性规则会把未显式标注为导出的符号设置为本地隐藏,因此最终
vkCreateXlibSurfaceKHR变成了共享库的内部符号,外部无法访问。
修复方案
- 编译
volk.c时添加编译参数-DVOLK_IMPLEMENTATION:这个宏会强制Volk生成所有Vulkan函数指针的强导出定义,而非暂定定义。 - 如果已经添加了上述宏仍有问题,可额外添加编译参数
-fvisibility=default,或显式定义-DVOLK_EXPORT=__attribute__((visibility("default"))),强制Volk的符号全局导出。 - 修复后可通过
nm -D drivers/libdrivers.linuxbsd.tools.64.so | grep vkCreateXlibSurfaceKHR验证:如果输出中出现大写的B或D标识的符号,说明已经成功导出,重新链接即可解决未定义引用报错。
内容的提问来源于stack exchange,提问作者dmoody256
相关产品推荐
相关产品推荐

