如何使用CMake将header-only库VulkanMemoryAllocator编译为静态库
你的配置存在三个核心问题:
- CMake默认不会将.h后缀的文件作为编译源文件处理,仅会视为头文件,因此你创建的静态库实际没有有效编译单元,生成的库文件为空
- 定义编译宏错误使用了
target_compile_options接口,该接口用于传入编译参数,添加预定义宏应该使用target_compile_definitions,否则不会自动添加-D前缀,宏定义不生效 - 仅设置了目标的链接语言,没有显式指定头文件的编译语言,无法实现
-x c++的效果
修正后的CMake配置(完全匹配你给出的shell命令效果)
add_library(VulkanMemoryAllocator STATIC) # 将VMA头文件加入源文件列表 target_sources(VulkanMemoryAllocator PRIVATE VulkanMemoryAllocator-Hpp/vk_mem_alloc.h) # 显式指定该头文件作为C++源文件编译,等价于shell命令的-x c++参数 set_source_files_properties(VulkanMemoryAllocator-Hpp/vk_mem_alloc.h PROPERTIES LANGUAGE CXX) # 对外暴露头文件搜索路径 target_include_directories(VulkanMemoryAllocator PUBLIC VulkanMemoryAllocator-Hpp/) # 私有添加VMA实现宏,仅编译库时生效,等价于shell命令的-DVMA_IMPLEMENTATION参数 target_compile_definitions(VulkanMemoryAllocator PRIVATE VMA_IMPLEMENTATION) # 指定链接语言为C++ set_target_properties(VulkanMemoryAllocator PROPERTIES LINKER_LANGUAGE CXX)
可选替代方案(配置更直观,无需修改头文件属性)
你也可以新增一个独立的C++源文件,比如命名为vk_mem_alloc.cpp,内容仅需两行:
#define VMA_IMPLEMENTATION #include "vk_mem_alloc.h"
对应简化后的CMake配置:
add_library(VulkanMemoryAllocator STATIC vk_mem_alloc.cpp) target_include_directories(VulkanMemoryAllocator PUBLIC VulkanMemoryAllocator-Hpp/) set_target_properties(VulkanMemoryAllocator PROPERTIES LINKER_LANGUAGE CXX)
两种方案生成的静态库效果完全一致,都可以正常链接使用。
内容的提问来源于stack exchange,提问作者dorfen_
相关产品推荐
相关产品推荐

