前提:我希望我的 C++ 应用程序不依赖于任何东西
Microsoft Visual C++ redistributable
,这样我就可以提供开箱即用的可执行文件。
我首先做了什么:将运行时库从
Multithread (/MT)
切换到DLL Multithread (/MD)
,以避免需要msvcr110.dll
(VS 2013不应该需要120版本,因为它是编译器版本?)。为此,我还必须重新编译我正在使用的另一个库和相同的运行时库,这很有效。我有我的 .exe,它可以在任何地方运行而不会出现问题(或者我没有意识到,哈哈)。
然后我添加了一些使用 LuaJIT 的功能。我已经通过包中提供的
msvcbuild.bat
构建了 LuaJIT,它的工作就像一个魅力,但现在我的可执行文件需要 msvcr110.dll
才能运行。我想那是因为 LuaJIT 是用 /MD 标志编译的,但我想知道是否有正确的方法来做我想要的事情。
您应该使用 static 命令行参数运行 msvcbuild.bat。
我没有对此进行测试,但您很可能需要在您所做的编译的每个部分上使用 /MT 标志。在这种情况下,您的主程序和 LuaJIT 都是如此。在该 msvcbuild.bat 文件(https://github.com/luvit/luajit-2.0/blob/master/src/msvcbuild.bat)中,您可以看到它们明确指定了 /MD(第 17 行)。我认为这是你的问题。改为 /MT 看看。
LuaJIT Makefile 说:
# Windows 不支持混合模式。而且静态模式效果不佳。
# C 模块无法加载,因为它们绑定到 lua51.dll。
我不是 Windows 用户,也没有安装工作版本,所以我无法测试它,但静态链接很可能不起作用(很好)。
如果有人成功在 Windows 上静态构建 Lua 并且它可以使用 C 模块,请 lmk。现在我假设它会产生一个损坏的构建。