一、开发环境
- 操作系统:Fedora 23
- 集成开发环境:Code::Blocks 16.01
- G++版本:5.3.1
- GTK+版本:2.24.30(使用命令
sudo dnf install gtk2 gtk2-devel gtk2-devel-docs
安装) - wxWidgets版本:3.1.0
二、静态库与动态库
库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(*.a或者*.lib)和动态库(*.so或者*.dll)。所谓“静态”、“动态”是指由目标代码生成可执行文件时是采用的静态链接的方式还是动态链接的方式。
静态编译就是把程序调用的函数所在的*.a或者*.lib文件中的目标代码直接链接进可执行文件,程序运行的时候不再需要其它的库文件。动态编译就是把程序调用的函数所在的*.so或者*.dll文件的文件名和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从*.so或者*.dll文件中寻找相应函数代码,因此需要相应*.so或者*.dll文件的支持。
我们调用静态库或者动态库中的函数的时候需要包含对应的头文件,并且在编译的时候要指定头文件的路径以及库的路径。一个库可能对应多个头文件,因为一个静态库或者动态库由一个或多个目标文件生成,而每个目标文件都对应着一个头文件。
三、选择静态编译wxWidgets的原因
众所周知,wxWidgets是一个跨平台的图形库,我们把这个图形库以源码包的形式安装到自己的电脑上有两种方式。一种是将图形库编译成动态库,也就是生成*.so或者*.dll文件。另一种是将图形库编译成静态库,也就是生成*.a或者*.lib文件。
将wxWidgets编译成静态库的形式可以方便wxWidgets应用程序在不同计算机上运行,因为采用静态编译的方式程序可以在没有安装wxWidgets图形库的计算机上运行。但程序占用的储存空间以及内存要比动态编译的方式要大很多,并且采用静态编译的方式不便于程序的更新。
四、静态编译wxWidgets图形库
安装wxWidgets时,我们通常都是使用默认参数依次输入./configure
、make
、sudo make install
将wxWidgets编译成动态库。但是我们也可以在原来动态编译的顶层目录下新建一个目录,进入新目录后依次输入../configure --disable-shared
、make
、sudo make install
将wxWidgets编译成静态库。
五、静态编译wxWidgets应用程序
新建一个wxWidgets工程,输入源代码(这里使用Code::Blocks自动生成的模板工程):
在Project菜单中点击Build options…,将头文件的路径“…/wxWidgets-3.1.0/include”添加到编译器的头文件搜索路径(静态库与动态库的头文件路径相同),将静态库的路径“…/wxWidgets-3.1.0/Static/lib”添加到链接器的搜索路径(“Static”更改为静态编译wxWidgets图形库时新建的目录的目录名):
编译并运行程序,当在终端中运行程序时会发现不会报出找不到共享库的错误: