VulkanMemoryAllocator链接报错:未解析外部符号问题求助
你遇到的链接错误:
main.cpp.obj : error LNK2019: unresolved external symbol vmaCreateAllocator referenced in function "private: void __cdecl hi::v1::gfx_device::initialize_device(void)" (?initialize_device@gfx_device@v1@hi@@AEAAXXZ)
main.cpp.obj : error LNK2019: unresolved external symbol vmaDestroyAllocator referenced in function "public: __cdecl hi::v1::gfx_device::~gfx_device(void)" (??1gfx_device@v1@hi@@QEAA@XZ)
本质是myproject没有正确链接到VulkanMemoryAllocator的实现库,以下是具体修复步骤:
1. 强制VMA构建为可链接的库
VMA默认CMake配置可能仅以头文件模式提供,需手动开启静态/动态库构建。修改根目录CMakeLists.txt:
project(myproj1 CXX) find_package(Vulkan REQUIRED) # 开启静态库构建(推荐,避免动态库依赖问题) set(VMA_BUILD_STATIC_LIBRARY ON CACHE BOOL "Build VMA as static library") # 若需动态库,替换为: # set(VMA_BUILD_SHARED_LIBRARY ON CACHE BOOL "Build VMA as shared library") add_subdirectory(hikogui) add_subdirectory(vma) add_subdirectory(myproject)
2. 添加匹配的编译宏
根据VMA的库类型,在myproject的CMakeLists.txt中添加对应的编译宏,确保符号正确导出/导入:
如果使用静态库:
add_library(myproject SHARED ${SOURCES} ${HEADERS}) target_compile_definitions(myproject PRIVATE VMA_STATIC) # 新增此行 target_link_libraries(myproject PRIVATE ${Vulkan_LIBRARY} Vulkan::Vulkan) target_link_libraries(myproject PRIVATE GPUOpen::VulkanMemoryAllocator) target_link_libraries(myproject PRIVATE hikogui)
如果使用动态库:
target_compile_definitions(myproject PRIVATE VMA_DYNAMIC) # 替换为此行
3. 清理缓存重新构建
删除项目的CMake构建缓存目录(如build文件夹),重新运行CMake生成配置,再执行完整编译,避免旧缓存干扰。
内容的提问来源于stack exchange,提问作者Rabbit0w0

