您的位置: 首页 - 站长

iis建立的网站打不开个人房产网签查询系统

当前位置: 首页 > news >正文

iis建立的网站打不开,个人房产网签查询系统,上海市建设小学网站,做电商需要准备多少钱文章目录 前言预处理 -E编译 -S汇编 -c链接动静态链接 前言 在计算机中的每一个程序是由代码变化而来的#xff0c;但是事实上来说#xff0c;用 c/C 写出的代码是不能被计算机识别的#xff0c;其中必须经过一系列的过程才能使这个代码能成功的被计算机识别#xff1b; … 文章目录 前言预处理 -E编译 -S汇编 -c链接动静态链接 前言 在计算机中的每一个程序是由代码变化而来的但是事实上来说用 c/C 写出的代码是不能被计算机识别的其中必须经过一系列的过程才能使这个代码能成功的被计算机识别 这几个过程分别为 预处理编译汇编链接 在经历过这几个过程之后才能将代码转换为一个可执行程序; 预处理 -E 在预处理阶段时一般会进行 去注释 - 将源文件中的注释使用空格代替宏替换 - 若是源文件中存在以#define定义的宏则将其替换头文件展开 - 将头文件进行展开条件编译 - 根据条件编译中的条件留下正确条件 该些操作一般为文本操作且该些操作结束后也仍为c/C g -E test.cpp将test.cpp文件进行预处理,并将预处理后的结果显示在显示器上;g -E test.cpp -o test.i将test.cpp文件进行预处理,同时指定生成一个 test.i临时文件;-E 指令从现在开始进行程序的翻译,如果预处理完成则停止; 从上图可以看出预处理前后的区别 可以看出两个文件大小的差距,源文件中的代码量大概只有23行,而再进行预处理过后,代码量变成接近三万行; 编译 -S 编译这个过程则是将预处理后的 .i 文件进行翻译,将c/C代码翻译成汇编代码 .s文件; g -S test.i 或是 g -S test.i -o test.s将test.i文件编译成汇编语言 , 两种方法都可以生成test.s文件 ; 第二种方法可以指定生成文件的文件名(这里后缀一般不影响);g -S test.cpp -o test.s作用同上,唯一不同的为这里将从test.cpp文件开始进行翻译,途中将要重新进行一次预处理;;-E 指令从现在开始进行程序的翻译直到编译完成; 汇编 -c 在这个阶段过后,.s文件将会被转为可重定向二进制目标文件( .o 文件); 虽然这里转化为了二进制文件,但是仍然不能被计算机直接进行识别; g -c test.s 或是 g -c test.i -o test.o将汇编语言文件 test.s 进行汇编生成可重定向二进制目标文件 test.ood 命令将指定内容文件以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示。默认使用的是八进制-c 指令从现在开始进行程序翻译直到汇编结束。 [如图所示为使用vim打开时所显示的为二进制] 这里所生成的可重定向二进制文件并不能被执行; 这里或多或少可能会存在权限问题,因为所生成的可重定向二进制文件的权限为666 (~umask)为664; 即没有运行的权限,为了排除该情况,修改文件权限; 但即使修改了文件权限也依然不能运行; 需要打开该文件即可以使用od命令将文件打开; 链接 这也是程序翻译的最后一个步骤,即将多个.o 或者 .obj 文件合并成一个可执行程序 .exe ; g test.cpp -o test 或 g -o test test.cpp将 test.cpp源文件编译生成 test可执行程序; 然而在链接这一过程中也有分情况,分别为动态链接与静态链接; 动静态链接 在这之前首先要介绍两个命令: ldd filename file filename查看该文件所依赖的库文件可以查看文件的可执行程序状态位数、动态链接等 一般的连接方式分为两种: a.动态链接b.静态链接需要动态库需要静态库 在调用函数中总是会包含各种头文件,但只有头文件是并不能将程序编译通过的; 头文件中只包含了各个函数的声明,而函数的定义一般以库的形式展示; 步骤一般为,在调用函数过后,从头文件中找到函数的声明,再去对应的库中找到函数的定义从而进行调用; 头文件 : 用来提供函数的声明库文件 : 用来提供函数的定义(实现) 自己写的源文件包含头文件,链接库文件才能生成一个可执行程序; 系统\库动态库静态库Linux.so .aWindows.dll.lib 在安装vs2019或者vs2022这种编译器时,虽然叫做配置环境,但是本质上是在安装所用语言的头文件以及库文件; C程序是脱离不开库文件的; 在Linux中,许多的命令也是利用c语言实现的,例如在Linux中使用的ls命令; 在汇编过后所生成的可重定向二进制目标文件; #includeiostreamint main() {std::cout its a test fail std:: endl;return 0; }从该文件中可以看到,该文件包含了一个文件 ,且调用了流插入流提取; 而这里生成的可重定向二进制文件只是将自己写的源文件中的代码生成可重定向的二进制目标文件; 至于代码中所包含的头文件以及使用流插入流提取并没有进行操作; 该操作将会在最后一步的链接过程中; 链接过程将会把该重定向二进制文件与对应的库文件进行链接最终生成一个可执行程序;(头文件在预处理阶段被展开) 静态链接动态链接原理在生成可执行文件的时候(链接阶段)把所有需要的函数的二进制代码都包含到可执行文件中去。因此链接器需要知道参与链接的目标文件需要哪些函数同时也要知道每个目标文件都能提供什么函数这样链接器才能知道是不是每个目标文件所需要的函数都能正确地链接。如果某个目标文件需要的函数在参与链接的目标文件中找不到的话链接器就报错了。目标文件中有两个重要的接口来提供这些信息一个是符号表另外一个是重定位表。在编译的时候不直接拷贝可执行代码而是通过记录一系列符号和参数在程序运行或加载时将这些信息传递给操作系统操作系统负责将需要的动态库加载到内存中然后程序在运行到指定的代码时去共享执行内存中已经加载的动态库可执行代码最终达到运行时连接的目的。缺点静态库的缺点为若是多个文件同时调用同一个函数则可能出现在一个项目中出现大量重复代码动态库链接的缺点即为过于依赖动态库方法g test.cpp -o test -static(-static : 表明使用静态链接的方式形成可执行程序)g test.cpp -o test (默认即为动态链接) 一般的机器可能会因为没有静态库而导致静态链接失败; 在Linux中,动态链接必须使用 .so 动态库文件; 静态链接必须使用 .a 静态库文件; 若是没有静态库文件则需要进行安装 :
c静态库安装命令C静态库安装命令(sudo yum install -y glibc-static)(sudo yum install -y libstdc±static)