我在qt creator中使用g ++和qmake尝试运行一个打开vulkan库的简单vulkan应用程序,我收到以下错误:
/home/cpnblank/Documents/vulkandev/qmakecpptest/main.cpp:12:错误:未在此范围内声明'RTLD_NOW' void * vulkan_library = dlopen(“libvulkan.so.1”,RTLD_NOW); ^ ~~~~~~~
/home/cpnblank/Documents/vulkandev/qmakecpptest/main.cpp:12:错误:'dlopen'未在此范围内声明 void * vulkan_library = dlopen(“libvulkan.so.1”,RTLD_NOW); ^ ~~~~~
#define VK_NOPROTOTYPES
#include <iostream>
#include "vulkan.h"
#include "vk_platform.h"
using namespace std;
int main()
{
#if defined __linux
void *vulkan_library = dlopen("libvulkan.so.1", RTLD_NOW);
#endif
if (vulkan_library == nullptr) {
std::cout << "could not connect";
}
cout << "Hello World!" << endl;
return 0;
}
任何想法?
答案 0 :(得分:1)
阅读dlopen(3)的文档,并养成阅读所有功能文档的习惯。
你错过了
#include <dlfcn.h>
,您的链接命令应包含-ldl
。在dlopen(3) man
页面中都提到了这两个页面(您可以在终端中尝试使用man dlopen
来获取它;请参阅man(1))。
请注意,dlopen
会处理不包含/
的特殊路径。您可能希望将一些绝对文件路径传递给dlopen
。因此,dlopen
的使用可能会失败,您应该更好地处理该失败(使用dlerror(3)和exit(3)需要<stdlib.h>
):
if (vulkan_library == nullptr) {
std::cerr << "could not connect to libvulkan: " << dlerror() << std::endl;
exit (EXIT_FAILURE);
}
顺便说一句(因为你#include "vulkan.h"
),你可能不需要dlopen
libvulkan.so.1
但你应该link你的程序到那个库(可能是将-lvulkan
传递给某个g++
链接命令)。阅读Program Library HowTo,Drepper的How To Write Shared Libraries,documentation of qmake
,GNU make
,如何invoke the g++
compiler,GNU ld
linker的文档,等
还要注意name mangling
的Vulkan Support in Qt