我想用 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
$
也更新了问题标题。
我已经解决了这个问题。这是我的第 8 层(使用)问题。
链接参数的库必须在带有
GCC/G++
的源之后,当然,不能在之前:
$ g++ -o vkExtension vkExtension.cpp -lvulkan
完全忘记了
GCC/G++
的这种行为。抱歉,其他 SO 用户浪费了您的时间。