Windows平台Meson项目DLL运行时链接及导入库生成问题求助
Windows下Meson生成DLL及导入库的正确配置
完整示例配置
# 引擎头文件目录 luna_includes = include_directories('engine/include') # 编译引擎为共享库(DLL) engine = shared_library( 'luna', 'engine/src/engine.cpp', include_directories: luna_includes, # 编译引擎时定义导出宏 cpp_args: ['-DLUNA_EXPORTS'], install: true ) # 声明引擎依赖,供游戏可执行文件使用 engine_dep = declare_dependency( link_with: engine, include_directories: luna_includes, # 给游戏端传递导入宏定义 compile_args: ['-DLUNA_IMPORTS'] ) # 编译游戏可执行文件 executable( 'game', 'game/src/game.cpp', dependencies: [engine_dep], install: true )
关键步骤说明
修正变量名错误:你原始配置中定义了
includes但使用luna_includes,属于笔误,统一变量名才能正确传递头文件目录。添加DLL符号导出宏:Windows下必须显式标记要对外暴露的符号,否则MSVC不会生成导入库。在引擎的公共头文件(如
engine/include/luna/engine.h)中添加以下宏定义:
#ifndef LUNA_ENGINE_H #define LUNA_ENGINE_H #ifdef _WIN32 # ifdef LUNA_EXPORTS # define LUNA_API __declspec(dllexport) # else # define LUNA_API __declspec(dllimport) # endif #else # define LUNA_API #endif // 示例:导出引擎函数 LUNA_API void engine_init(); LUNA_API void engine_update(); #endif // LUNA_ENGINE_H
- 编译引擎时,
LUNA_EXPORTS宏会让LUNA_API展开为__declspec(dllexport),标记符号需要导出。 - 编译游戏时,
LUNA_IMPORTS宏会让LUNA_API展开为__declspec(dllimport),告诉编译器从导入库链接符号。
- Meson自动生成导入库:当使用MSVC编译时,只要有符号被导出,Meson的
shared_library目标会自动生成.dll(运行时库)和对应的.lib导入库。如果没有导出符号,MSVC不会生成导入库,这是你遇到LNK1181错误的核心原因。
排查要点
- 确认使用MSVC编译器:如果是MinGW,生成的导入库是
.a文件,链接错误信息会不同。 - 检查导出符号:确保引擎代码中有
LUNA_API标记的函数/类,无导出符号则不会生成导入库。 - 验证生成文件:编译后在构建目录(如
builddir)的对应子目录下,可找到luna.dll和luna.lib。
内容的提问来源于stack exchange,提问作者random_ab_user
相关产品推荐
相关产品推荐

