在 Debian 12 上使用 GNU ld 链接 libvulkan(未定义参考)的问题

问题描述 投票:0回答:1

我想用 Vulkan 学习编程。我的第一步是枚举系统上可用的 Vulkan 扩展数量。所以我写了这个简单的代码:

#include <iostream>

#include <vulkan/vulkan.hpp>

int main(int argc, char *argv[])
{
    VkResult ret;
    unsigned int propertyCount;
    
    ret = vkEnumerateInstanceExtensionProperties(NULL, &propertyCount, NULL);
    
    if (ret != VK_SUCCESS)
        return 1;
    
    std::cout << "Vulkan: Extension Count: " << propertyCount << std::endl;
    
    return 0;
}

当我尝试编译和链接代码时,出现

undefined reference
错误:

$ g++ -lvulkan -o vkExtension vkExtension.cpp
/usr/bin/ld: /tmp/user/1000/ccgB9M9N.o: in function `main':
vkExtension.cpp:(.text+0xc99): undefined reference to `vkEnumerateInstanceExtensionProperties'
collect2: error: ld returned 1 exit status
$

虽然

libvulkan
安装在我的系统上(Debian 12):

$ cd /usr/lib/x86_64-linux-gnu
$ ls -la | grep libvulkan
-rw-r--r--   1 root root   8575696 Mar 22  2023 libvulkan_intel_hasvk.so
-rw-r--r--   1 root root  11115728 Mar 22  2023 libvulkan_intel.so
-rw-r--r--   1 root root   6918024 Mar 22  2023 libvulkan_lvp.so
-rw-r--r--   1 root root   8711344 Mar 22  2023 libvulkan_radeon.so
lrwxrwxrwx   1 root root        14 Feb  6  2023 libvulkan.so -> libvulkan.so.1
lrwxrwxrwx   1 root root        20 Feb  6  2023 libvulkan.so.1 -> libvulkan.so.1.3.239
-rw-r--r--   1 root root    457224 Feb  6  2023 libvulkan.so.1.3.239
$

我也检查了库本身是否缺少功能(符号),但应该在已安装的库中可用。命令

nm
不会列出任何符号,因为库已被删除。所以我用了
readelf
:

$ readelf -s --wide libvulkan.so.1.3.239 | grep vkEnumerateInstance
   136: 0000000000034850   687 FUNC    GLOBAL DEFAULT   12 vkEnumerateInstanceExtensionProperties
   170: 0000000000034b00   639 FUNC    GLOBAL DEFAULT   12 vkEnumerateInstanceLayerProperties
   283: 0000000000034d80   709 FUNC    GLOBAL DEFAULT   12 vkEnumerateInstanceVersion
$

我还检查了链接器(GNU ld)的默认库搜索路径,但路径是正确的。

缺少什么?

(SO上也有类似的问题。但不幸的是没有答案。)

更新

似乎问题与

GNU GCC/ld
相关。尝试使用
clang++/LLVM
构建代码,成功了:

$ clang++ -Wall -Wextra -lvulkan -o vkExtension vkExtension.cpp
vkExtension.cpp:5:14: warning: unused parameter 'argc' [-Wunused-parameter]
int main(int argc, char *argv[])
             ^
vkExtension.cpp:5:26: warning: unused parameter 'argv' [-Wunused-parameter]
int main(int argc, char *argv[])
                         ^
2 warnings generated.
$ ./vkExtension
Vulkan: Extension Count: 20
$

也更新了问题标题。

g++ debian linker-errors ld vulkan
1个回答
0
投票

我已经解决了这个问题。这是我的第 8 层(使用)问题。

链接参数的库必须在带有

GCC/G++
的源之后,当然,不能在之前:

$ g++ -o vkExtension vkExtension.cpp -lvulkan

完全忘记了

GCC/G++
的这种行为。抱歉,其他 SO 用户浪费了您的时间。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.