Msys2工具链静态编译方法
静态编译的好处是发布的时候不用带上一堆动态链接库。Msys2工具链理论上是支持静态编译的,但实际使用的时候即使直接加上-static开关,链接生成的可执行文件最后运行时还是会提示缺失动态链接库,尤其是Mingw工具链依赖的libwinpthread-1.dll、libstdc++-6.dll和libgcc_s_seh-1.dll这"三大件"。而对于clang编译器,运行时依赖又变成了libc++.dll。本文探讨一种简便的办法,方便针对不同编译器的静态链接编译管理。
1. FLTK项目静态编译
这里用FLTK实现一个简单的窗口应用,FLTK的LICENSE支持发布静态链接版本的程序,而且生成的程序体积非常小,用来编写和发布小工具十分方便。
// --- mian.cpp ---
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/fl_ask.H>
class SimpleWindow : public Fl_Window
{
private:
Fl_Button *button;
public:
SimpleWindow(int w, int h, const char *title) : Fl_Window(w, h, title)
{
color(FL_WHITE);
button = new Fl_Button(w / 2 - 50, h / 2 - 20, 100, 40, "Click Me!");
button->color(FL_BLUE);
button->labelcolor(FL_WHITE);
button->callback([](Fl_Widget *w, void *data)
{
fl_message_title("Click Me!");
fl_message("You clicked the button!"); }, NULL);
end();
}
};
int main(int argc, char **argv)
{
SimpleWindow window(400, 300, "FLTK Simple Window");
window.show(argc, argv);
return Fl::run();
}
msys2安装的FLTK提供了fltk-config工具用于配置和编译FLTK项目源码,使用该工具可以很方便地将FLTK项目的cpp源码编译成可执行文件。
fltk-config --compile main.cpp --link -static
--link -static表示链接静态库,运行效果如下图所示。