vs 运行库知识点

一、问题

  • 我们编译c/c++的执行程序(exe),如果运行库没有选择静态编译(mt),那么可能在别的电脑上就无法运行(因为没有对应的运行库)
  • 程序选择mt静态遍历,我们链接别的第三库会出现链接报错

上面是我们用c/c++编译经常遇到问题。

二、运行具体文件的作用[vs2019为例子]

  • vcruntime140: c语言运行库,比喻我们用到prinf
  • msvcp140.dll c++ 运行库 ,比喻我们用到的 std::cout
  • 其他补充,以前的版本不一定有,有可能是win10才有

140 代表是运行库的版本号,你用的vs版本不一样,这里数字不一样。

三、解释

1:问题1解决办法

  • exe 运行库选择mt,这个在vs 工程选项 c/c++ 运行库进行设置
  • 安装包写脚本自动检测,安装对应的运行库程序【用的不少,但国内版本比较多,不一定能安装成功】
  • 自己直接在exe运行库放 所有运行库,直接从vs 目录找到对应的版本运行库就可以了【这种比较多】

2:问题2解决办法

如果你exe选择静态遍历,第三方库选择md 动态编译,链接时候会发现运行库的代码已经实现,出现冲突,相当于定义出现2次了,导致无法链接。【凭记忆写的,改天自己用一个第三方库验证一下】

第三方库也选择静态编译就不会冲突了,但实际中非常麻烦,这个c/c++ 非常不方便地方,跟现在高级语言比起来麻烦很多,导致新手门槛太高。我自己都不怎么用c/c++写一些工具,用别的高级语言,直接几行命令就可以继承第三方的库直接开始工作,c/c++还需要单独编译,单独编译还不一定能成功。

四、总结

本篇文章只是为了记录一下,因为前段时间正好思考这个问题,到底他们运行库怎么搞的,为什么会编译出错等等。有些问题不思考,不验证还真不知道具体原因,只知道那样子操作就可以,但具体为什么却不知道

lua 源码简单分析

一,背景

这类技术自己没有研究过,只是用过lua,当时只是感觉跟JS一样,没有特别的感觉,他的代码非常少,我下载1.0的代码。

二,概括

通过lex与yacc 进行词法和语法分析,语法分析加了自己的c语言的逻辑代码。

三,分析

lua_dofile 加载指定的lua文件。

int lua_parse (void)
{
 Byte *initcode = maincode;
 err = 0;
 if (yyparse () || (err==1)) return 1;
 *maincode++ = HALT;
 //PrintCode();
 if (lua_execute (initcode)) return 1;
 maincode = initcode;
 return 0;
}

yyparse 进行词法分析与语法分析【这个是编译通用工具,不过我没有使用过,我只是网上查资料了解到】

int lua_execute (Byte *pc)
{
 while (1)
 {
  switch ((OpCode)*pc++)
  {
   case NOP: break;
   
   case PUSHNIL: tag(top++) = T_NIL; break;
   
   case PUSH0: tag(top) = T_NUMBER; nvalue(top++) = 0; break;
   case PUSH1: tag(top) = T_NUMBER; nvalue(top++) = 1; break;
   case PUSH2: tag(top) = T_NUMBER; nvalue(top++) = 2; break;

   case PUSHBYTE: tag(top) = T_NUMBER; nvalue(top++) = *pc++; break;
   
   case PUSHWORD: 
    tag(top) = T_NUMBER; nvalue(top++) = *((Word *)(pc)); pc += sizeof(Word);
   break;
...............

while 取指令,然后执行对应行为,变量处理通过top 堆栈进行操作。

四,样例

local a = 10 * 6;
print(a)
PUSHBYTE   10
PUSHBYTE   6
MULTOP
PUSHGLOBAL   4 //获取print对象,这个存在全局table 函数数组里面
PUSHMARK
PUSHGLOBAL   33 //a 这个变量
CALLFUNC
ADJUST   0

这个生成对应的字节码,然后调用lua_execute 执行,你可以下断点自己测试。

五,vscode 编译调试[windows]

因为我觉得直接用vs 编译调试感觉太重了,于是采用vscode来编译。