RTLD_NOW和dlopen未在此范围内声明qt creator vulkan dlopen

时间:2018-06-09 03:53:27

标签: c++ qt ubuntu g++ vulkan

我在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;
}

任何想法?

1 个答案:

答案 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 Librariesdocumentation of qmakeGNU make,如何invoke the g++ compilerGNU ld linker的文档,等

还要注意name mangling

Vulkan Support in Qt