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 类的析构函数为虚析构函数后实现了多态,就可以确保执行正确的析构函数,完成资源的释放
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)