mingdu.zheng <at> gmail <dot> com
FLTK使用标准的autoconf/automake工具进行配置编译,因此理论上只需要典型的三歩曲:configure、make、make install,但是因为版本的问题需要做一些特殊地处理。先说说能够正确编译通过的配置,这个配置将使用mingw-gcc编译器,而不是默认的cygwin-gcc编译器,并开启dll共享库选项,这个配置生成的FLTK库及相关程序不依赖cygwin1.dll,是原生的Windows程序。
$ CC=i686-pc-mingw32-gcc CXX=i686-pc-mingw32-g++ CPP=i686-pc-mingw32-cpp ./configure --enable-shared
编译完成后需要拷贝mingw-gcc运行时文件到程序所在目录,或者将mingw-gcc运行时文件所在目录添加到PATH环境变量,mingw-gcc的运行时文件位于/usr/i686-pc-mingw32/sys-root/mingw/bin/,在make的过程中会出现无法编译test程序的错误,这是因为fluid缺少运行时库不能正常运行导致的,将运行时库拷贝到fluid目录下,重新make即可。
Cygwin-1.7.17默认gcc编译器不再支持-mno-cygwin编译选项,而是通过另外的mingw-gcc编译器提供-mno-cygwin支持,FLTK默认配置使用-mno-cygwin编译选项,因此如果在Cygwin下使用默认配置将出现C编译器无法工作的错误。
$ ./configure
checking for gcc... gcc
checking whether the C compiler works... no
configure: error: in `/cygdrive/f/fltk-1.3.2':
configure: error: C compiler cannot create executables
See `config.log' for more details
FLTK除了可以使用mingw-gcc编译成原生Windows程序外,也可以使用选项--enable-cygwin配置成依赖于cygwin1.dll的Cygwin程序,--enable-cygwin选项将去掉-mno-cygwin选项,cygwin-gcc将可以正常工作,但是在链接的过程会产生符号未定义的问题。
$ ./configure --enable-cygwin
$ make
......
Linking fluid.exe...
../lib/libfltk.a(fl_dnd.o):fl_dnd.cxx:(.text$_ZN12FLDropSource14QueryInterfaceERK5_GUIDPPv+0x18):对‘_IID_IUnknown’未定义的引用
../lib/libfltk.a(fl_dnd.o):fl_dnd.cxx:(.text$_ZN12FLDropSource14QueryInterfaceERK5_GUIDPPv+0x53):对‘_IID_IDropSource’未定义的引用
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld: ../lib/libfltk.a(fl_dnd.o): bad reloc address 0x53 in section `.text$_ZN12FLDropSource14QueryInterfaceERK5_GUIDPPv'
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld: final link failed: 无效的操作
collect2: ld 返回 1
Makefile:50: recipe for target `fluid.exe' failed
make[1]: *** [fluid.exe] Error 1
Makefile:24: recipe for target `all' failed
make: *** [all] Error 1
链接到FLTK的应用程序也只能使用mingw-gcc编译器,使用cygwin-gcc编译器同样会出现符号未定义的问题,FLTK提供了标准的配置工具fltk-config。使用fltk-config --cxx获取编译器,使用fltk-config --cxxflags获取合适的编译选项,使用fltk-config --ldflags获取合适的链接选项。一个简单应用可以使用下面的命令来编译。
`fltk-config --cxx --cxxflags` hello.cxx -o hello.exe `fltk-config --ldflags`
需要注意的是链接中的-l选项一定要放在整行命令最后,否则可能会出现符号未定义错误,即使链接选项已经引入了该定义该符号的库。使用Eclipse编译时,选择Cygwin GCC工具链,手动将编译器/链接器更改为i686-pc-mingw32-gcc,不能选择MinGW GCC工具链,这里是在Cygwin环境下使用MinGW工具链。