这几天因项目需要,又把c/c++搬出来用了一遍(已经以.net为主了),用qt(也是现学滴)开发了一套应用程序管理框架,其中,涉及需要灵活更新对被管理的应用程序的控制的功能,思考了一下,应当找一套适合c/c++调用的脚本语言来完成,python、javascript等等我还会点点,后来发现lua也可以(我喜欢玩魔兽),好了,就它了,继续现学现用,嘿嘿。
先撸完了语法,能够写几个lua脚本了,接下来就是如何嵌入c/c++程序中调用了。
工欲善其事必先利其器,我撸lua的时候用的vscode,想着就用vscode来搞吧,先建一个c/c++项目,结果一上来就碰了一鼻子灰,我用的微软的cl.exe,结果各种报错,不是头文件找不到,就是链接失败,各种度各种谷,发现大多数都是minGW的解决方案,好吧,那我先用vs搞好了,再来看vscode怎么搞吧。
先说说需要用到的环境吧(注意,我是在windows下开发):
lua源码,或者编译好的二进制程序 下载
其中,include 文件夹里,就是到时需要引入的头文件的文件夹,lib里放置了静态库。我看了一下,官方提供的编译好的只有32位windows库,没有64位的,如果要64位的就需要自己编译。
接下来就是写一个c/c++控制台程序,试一试怎么调用lua了,感觉和v8引擎调用javascript差不多。
#include "stdafx.h"
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
int _tmain(int argc, _TCHAR* argv[])
{
lua_State *L = luaL_newstate();
lua_pushboolean(L, 1);
lua_pushstring(L, "hello lua");
int top = lua_gettop(L);
printf("%d\n", top);
lua_close(L);
return 0;
}
因为我创建的是c++项目,所以在引入lua头文件的时候,要特别处理一下。
到此,网上大多数的文章也是这样写的,但是一旦编译,就会报找不到符号的错误,我不知道其他人是如何通过编译并运行起来的。按照我的经验,这就是差了静态库导致的,可是那个lua的lib文件夹下,并没有一个后缀是lib的文件,只有一个liblua.dll.a文件,这不是linux下的库文件么???
不管三七二十一,我引入了看看,嘿,还就跑起来了,你说搞不搞笑。
好了,既然vs可以跑起来,那vscode就应当没问题,这里不得不说IDE用多了,基础的编译链接命令到底怎么用,还真不是很了解。
先说说c_cpp_properties.json的配置
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"D:\\lua\\Binaries-LuaDist-batteries-0.9.8-Windows-x86\\include\\*" <<< 注意这里
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
},
],
"version": 4
}
上述配置中,那个包含目录并不是用来给编译时查找头文件使用的,而是在写代码的时候,给智能提示使用的,所以不配置也可以。
然后重点就是preLaunchTask的那个task.json配置了
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "build exe",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/nologo",
"/Fe:",
// "/MACHINE:X86",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}",
"/ID:\\lua\\Binaries-LuaDist-batteries-0.9.8-Windows-x86\\include",
"/link",
"/LIBPATH:D:\\lua\\Binaries-LuaDist-batteries-0.9.8-Windows-x86\\lib",
"\"liblua.dll.a\"",
// "/MACHINE:X64"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$msCompile"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "编译器: cl.exe"
}
]
}
以上配置是我在坚信vs可以的情况下慢慢试出来的,以上配置就是编译链接的过程,最终会转换成对cl.exe的调用,其中重点就是如何引入头文件以及依赖库,大家仔细看看,注意link相关的指令的放置位置,不要放到"/link"前面去了,否则就会被解释为编译指令,从而被忽略了。
温馨提示:如果用微软的cl.exe作为编译工具,那么需要通过Developer Command Prompt进入vscode。另外,按照C/C++ for Visual Studio Code插件官方提示,不建议把cl.exe放置到全局环境中,大家看看官方文档:Configure Visual Studio Code for Microsoft C++
好了,以上就是c/c++如何嵌入lua的环境搭建了,希望本文对你有帮助 ^_^
更新:
lua官网有提供64位的库,包括静态和动态的,具体下载为:下载
如果是windows下开发,则选那个windows libraires,进去后根据你的需要选静态或动态库。