Windows下CMake 3.11无法定位Lua 5.3.4动态库,链接失败求助
解决Windows下CMake 3.11 + VS2017定位Lua 5.3.4动态库的问题
嘿,我来帮你搞定这个烦人的CMake找不到Lua动态库的问题!你遇到的错误“未找到Lua(缺失:LUA_LIBRARIES)(已检测到版本"5.3.4")”其实很典型——CMake已经找到了Lua的头文件(所以能识别版本),但找不到链接时需要的导入库文件(.lib),因为Windows下链接动态库必须用对应的.lib导入库,而不是直接用.dll。
下面给你几个可行的解决方案,按优先级排序:
方案1:补全Lua的导入库(最推荐)
首先检查你的Lua目录结构,正确的结构应该是这样的:
你的Lua根目录/ include/ lua.h luaconf.h lualib.h lauxlib.h # 这些头文件都得有,不然include可能也会出问题 lib/ lua53.lib # 关键!这个是链接时需要的导入库 lua53.dll # 运行时用的动态库
如果你的lib目录里没有lua53.lib,有两种方式获取:
- 如果你是从Lua官方下载的预编译包,通常会同时提供.dll和对应的.lib,可能你漏拿了;
- 如果只有.dll,用VS的工具生成导入库:
- 打开VS2017的开发者命令提示符(必须用这个,不然找不到dumpbin和lib工具);
- 切换到
lua53.dll所在的目录; - 执行命令生成导出函数列表:
dumpbin /exports lua53.dll > lua53.def - 打开生成的
lua53.def,删掉开头的无关信息(比如dumpbin的输出头),只保留EXPORTS和下面的函数列表,格式类似:EXPORTS lua_close lua_newstate lua_pushstring ...(所有导出的函数) - 执行命令生成导入库:
# 32位系统用/x86,64位用/x64 lib /def:lua53.def /out:lua53.lib /machine:x64 - 把生成的
lua53.lib放到lib目录下,重新运行CMake命令即可。
方案2:手动指定库路径,跳过FindLua模块的自动搜索
如果不想折腾导入库的生成,也可以直接在CMakeLists.txt里手动指定头文件和库的路径,绕开find_package的自动检测:
# 替换成你的Lua实际路径 set(LUA_INCLUDE_DIR "D:/path/to/your/lua/include") set(LUA_LIBRARIES "D:/path/to/your/lua/lib/lua53.lib") include_directories(${LUA_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${LUA_LIBRARIES})
这种方法更直接,避免CMake的FindLua模块在Windows下的兼容性问题,适合快速解决问题。
方案3:给FindLua模块明确指定库文件路径
如果你还是想用find_package,可以在调用它之前手动设置LUA_LIBRARY变量,告诉CMake去哪里找导入库:
set(LUA_LIBRARY "D:/path/to/your/lua/lib/lua53.lib") if(NOT DEFINED LUA_INCLUDE_DIR OR NOT DEFINED LUA_LIBRARIES) find_package(lua REQUIRED) endif() include_directories(${LUA_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${LUA_LIBRARIES})
这样CMake就会用你指定的库文件,不会再自己搜索找不到的情况。
最后提醒一下:运行程序的时候,要把lua53.dll放到程序的输出目录里,或者加到系统PATH里,不然运行时会提示找不到动态库。
内容的提问来源于stack exchange,提问作者Sinuous514
相关产品推荐
相关产品推荐

