You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
)

关键步骤说明

  1. 修正变量名错误:你原始配置中定义了includes但使用luna_includes,属于笔误,统一变量名才能正确传递头文件目录。

  2. 添加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),告诉编译器从导入库链接符号。
  1. Meson自动生成导入库:当使用MSVC编译时,只要有符号被导出,Meson的shared_library目标会自动生成.dll(运行时库)和对应的.lib导入库。如果没有导出符号,MSVC不会生成导入库,这是你遇到LNK1181错误的核心原因。

排查要点

  • 确认使用MSVC编译器:如果是MinGW,生成的导入库是.a文件,链接错误信息会不同。
  • 检查导出符号:确保引擎代码中有LUNA_API标记的函数/类,无导出符号则不会生成导入库。
  • 验证生成文件:编译后在构建目录(如builddir)的对应子目录下,可找到luna.dll和luna.lib。

内容的提问来源于stack exchange,提问作者random_ab_user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:42:03