易语言的静态编译是什么意思?

易语言的静态编译是什么意思?,第1张

1、编译是把支持库文件和程序分开来,如果给别人去用,别人却没安装易语言,就要把支持库文件带上给那人才能用.

2、静态编译就是把支持库文件打包到程序里去.这样,如果对方没装易语言也照样可以正常使用和独立编译.

3、在易语言中,想把一个易语言源码程序变成一个可执行的EXE软件程序,有三种编译方式:

一、编译。

这种方式只是把源码变成EXE文件,不把所用到的支持库一起打包进程序中。

优点是程序体积小,可以有效地减少某些杀毒软件的误报;

缺点是只可以在装有易语言的机器上使用,在没有易语言的电脑上会说缺少支持库。

二、独立编译。

在易语言4.X版中,可以把支持库写到EXE程序中,方便在没有易语言的电脑上使用。

缺点是程序体积大,容易误报。在易语言5.X版中,独立编译改为静态编译,不再把支持库整个地打包到程序中,而把用到的命令打包,所以体积有所减小,也减少了误报。

但是静态编译需要使用外部的链接器,如果设置不好,则无法编译。

三、编译成安装文件。

这种方式的编译,可以直接生成安装文件,方便在其他电脑中进行软件的安装。

缺点是不小心就会把源码也打包进去。

关于在 Linux 环境下面对 C 语言源程序进行静态编译,关键是要看你的 C 语言源程序中都使用到了哪些系统库函数?如果是标准的输入、输出库函数,只要在命令行提示符 $ 下面执行:

gcc my_prog.c 即可(缺省的可执行文件名是:a.out);如果在用户的源程序中使用到了数学计算函数,那么在命令行提示符 $ 下面必须执行:

gcc my_prog.c -IMATH.LIB(假设涉及到各种数学计算的数学库的库文件为:MATH.LIB)

如果不加上 -IMATH.LIB 选项,那么即使你的源程序编写得再正确,也无法正常编译。

另外还有一个必须要注意的就是:在 Linux 的环境变量中,一定要把 INCLUDE、LIB 所在的路径设置好(在 SHELL 文件中写好),这样在使用 Linux 系统时才能够减少出错的机会。

在 C++ 中动态联编需要虚函数的支持,这是因为虚函数的工作原理决定的,而正是因为使用了虚函数来实现动态联编,也让动态联编的效率略低于静态联编。通常,编译器处理虚函数的方法是: 给每个对象添加一个隐藏成员,隐藏成员保存了一个指向函数地址数组的指针 ,这个数组就是虚函数表(virtual function table, vtbl)。虚函数表中存储了为类对象进行声明的虚函数的地址,调用虚函数时,程序将查看存储在对象中的 vtbl 地址,然后转向相应的函数地址表,如果使用类声明中定义的第一个虚函数,则程序将使用数组中的第一个函数地址,并执行具有该地址的函数。

虚函数这个概念是 C++ 的精华之一,遇到虚函数时要注意以下几点:

1.定义一个函数为虚函数,不代表函数为不被实现的函数(可以有自己的实现)

2.定义它为虚函数是为了允许用基类的指针来调用子类的这个函数(提供了基类调用子类函数的方式)

3.定义一个函数为纯虚函数,代表函数没有被实现(声明后面接=0,例如:virtual func() = 0 此时派生类必须要实现此虚函数)

4.具有纯虚函数的类是抽象类,不能用于生成对象(即不能实例化),只能派生,它派生的类如果没有实现纯虚函数,那么他的派生类还是抽象类。虚析构函数

虚析构函数顾名思义就是将析构函数定义为虚函数。如果我们在派生中分配了内存空间,但是基类的析构函数不是虚析构函数,就会发生内存泄漏。看下面的例子:

#include <iostream>using namespace stdclass Base{public:

virtual void print(){

cout <<"This is Base's print function" <<endl

}

/* 对比加与不加 virtual 析构函数的调用情况 */

~Base(){

// virtual ~Base(){

cout <<"The destructor of Base" <<endl

}

}

class Derived : public Base{public:

void print(){

cout <<"This is Derived's print function" <<endl

}

~Derived(){

cout <<"The destructor of Derived" <<endl

}

}

int main(){

Base *p =

new Derived()

p->print()

delete p

return 0

}

不加 virtual 的运行结果:

加上 virtual 的运行结果:

在上面程序示加上 virtual 时编译器还是按照 Base 类型调用了析构函数,没有执行 Derived 类的虚析构函数,就造成了内存泄露。修改 Base 类的析构函数为虚析构函数后实现了多态,就可以确保执行正确的析构函数,完成资源的释放


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8151014.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存