在Visual Studio(2017)下,我正在尝试使用Lua 5.3编写C ++程序脚本,但是链接器在我的C ++源文件中找不到引用的三个函数名称:
未解析的外部符号_lua_close
未解析的外部符号_lua_createtable
未解析的外部符号_luaL_newstate
我从Lua website那里获取了C ++源代码。
我下载了Lua 5.3动态库,该库没有导入库,因此我使用如下的MSVC工具创建了导入库:
dumpbin /exports E:\Documents\Programmation\Lua5.3\lua53.dll
从dumpbin的输出中,我将146个名称复制到一个新文件“ mylua53lib.def”中,然后运行lib来生成.lib文件,如下所示:
lib /def:E:\Documents\Programmation\Lua5.3\mylua53lib.def /OUT:E:\Documents\Programmation\Lua5.3\mylua53lib.lib /machine:x86
链接器找不到的三个函数名称确实没有出现在dumpbin命令的输出中。
答案 0 :(得分:1)
旨在在Windows上进行动态链接的Lua二进制发行版应随附两个二进制文件:
有时,库文件将带有.a
扩展名,该扩展名在Linux上更常见(与Windows上的.lib
相对)。但是,如果是Windows构建,则只需将该文件作为链接器依赖项传递就可以了。 This question处理两种约定之间的差异。
作为一个旁注,为了使其正常工作,如果您在Visual Studio中创建一个C ++项目,并按照默认建议添加一个Source.cpp
,则仍然会遇到无法解决的外部问题。这是由于以下事实:尽管C源代码可以很好地编译为C ++代码,但链接程序将期望使用的C函数的定义名称乱码。可以通过将文件编译为C代码,或者最好通过告诉文件使用extern "C"
在链接库中取消Lua头文件中的名称来防止这种情况:
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>
}