我有这个简单的图书馆
lib.h
:
int lib()
lib.c
:
#include <stdio.h>
#include <dlfcn.h>
#define VK_NO_PROTOTYPES
#include <vulkan/vulkan.h>
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
int lib()
{
void *lib = dlopen("libvulkan.so.1", RTLD_NOW);
vkGetInstanceProcAddr = dlsym(lib, "vkGetInstanceProcAddr");
vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceLayerProperties");
uint32_t count;
vkEnumerateInstanceLayerProperties(&count, NULL);
printf("%d\n", count);
return 0;
}
我使用它编译到一个共享库
libabc.so: lib.o
$(CC) -shared -o $@ $^ -ldl
lib.o: lib.c lib.h
$(CC) -fPIC -g -Wall -c -o $@ $<
但是当我在应用程序中使用这个库时,vkEnumerateInstanceLayerProperties
在第 18 行调用时会出现段错误。
更重要的是,如果我将名称更改为其他名称vkEnumerateInstanceLayerProperties
,例如test
,那么一切正常并且(在我的系统中)6
被打印出来。如果我根本不使用动态库,它也可以工作,即我直接lib.c
与一起编译而没有.main.c
-fPIC
是什么原因造成的,我该如何解决?