一、VCF是什么?
二、为什么选择VCF?
VCF是一个Cross-platform Applicatin Framework for GUI with C++。其实可移植的GUI框架有很多,而且VCF还非常不成熟(目前版本是0.9.0),没有中文文档,甚至英文文档也不全面。VCF较QT, GTK, wxWidget相比,非常轻便,编译后的库不过20M,目前只实现了GUI层,关于Thread,Socket,OpenGL等方面还在开发中,当然对于我来说不需要,我只需要他的GUI功能足够了。其他发面也没有依赖他,有很多更优秀库可以选择。为什么选择VCF呢,主要有两个原因:1.他是轻量级的库(至少目前是,以后可能也会变成像wxWidget那样功能完善吧),使用和学习起来比较快。2.他的code结构非常清晰,没有任何别扭和难懂。而QT写的code基本都是伪代码,需要moc编译器处理后生成真正的C++代码;wxWidget在处理事件,调用main函数时都是用宏来处理(我是不喜欢在写code的时候到处用宏的),GTK其实提供的都是C接口,函数明非常长,而且有很多下划线,有些人不喜欢这种风格(我就是的),下面是VCF的code示例:
#include "vcf/ApplicationKit/ApplicationKit.h" using namespace VCF; class HelloWorldApp : public Application { public: HelloWorldApp( int argc, char** argv ): Application(argc, argv) { } virtual bool initRunningApplication() { Application::initRunningApplication(); Window* mainWindow = new Window(); setMainWindow( mainWindow ); mainWindow->setCaption( "Hello World" ); mainWindow->show(); return true; } }; int main(int argc, char *argv[]) { Application* app = new HelloWorldApp( argc, argv ); Application::main(); return 0; }
|
三、下载VCF的源码。
可以从他的官方网站下,也可以从sourceforge.net上下载,下载链接如下:
这里主要介绍windows平台下的mingw gcc编译方法,所以先下载包vcf-0.9.0.tar.gz
四、开始编译。
1.将包解压到c:\下,目录结构为c:\vcf-0.9.0
2.设置编译环境,我只是写了个批处理文件和一各cmd.exe的快捷方式就行了。env.bat用来设置环境变量,内容如下:
@echo off
c:
cd "C:\VCF-0.9.0"
rem 设置mingw gcc的目录(将c:\MinGW\bin改为你自己的gcc目录)
set path=%path%;c:\MinGW\bin
rem 设置VCF编译所需的头文件和库目录
set path=%path%;C:\VCF-0.9.0\src
set C_INCLUDE_PATH=%C_INCLUDE_PATH%;C:\VCF-0.9.0\src
set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;C:\VCF-0.9.0\src
set LIBRARY_PATH=%LIBRARY_PATH%;C:\VCF-0.9.0\lib
@echo on
|
再新建一个到cmd.exe的快捷方式,并设置他的目标为%windir%\system32\cmd.exe /k env.bat,起始目录为c:\vcf-0.9.0
3.VCF提供了很多build方式,对于mingw gcc的build文件为build\bakefiles.gen\makefile.gcc
VCF的build选项在build\bakefiles.gen\config.gcc文件中,通过makefile.gcc包含,具体设置如下:
CC = gcc #设置C编译器 CXX = g++ #设置C++编译器 CFLAGS = #设置C编译标志 CXXFLAGS = #设置C++编译标志 CPPFLAGS = #设置C/C++预处理标志 LDFLAGS = #设置链接器标志 OPTION_SELECTLIB = #设置库文件名后缀 OPTION_SHARED = 1 #设置是否编译为DLL库,1表示DLL库,0表示static库 OPTION_SHARED_RUNTIME = default #运行时库类型,default表示与OPTION_SHARED值相同,1表示DLL库,0表示static库 OPTION_DEBUG = 1 #设置是否编译为调试库,1表示调试库,0表示静态库 OPTION_ALLIN1 = 0 #设置是否将所有库编译成一个库 OPTION_ZLIB = 1 #设置是否编译ZLIB库 OPTION_LIBAGG = 1 #设置是否编译LIBAGG库 OPTION_LIBJPEG = 1 #设置是否编译LIBJPEG库 OPTION_LIBPNG =1 #设置是否编译LIBPNG库 OPTION_LIBMNG = 1 #设置是否编译LIBMNG库 OPTION_LIBTIFF = 0 #设置是否编译LIBTIFF库 OPTION_FREEIMAGE = 0 #设置是否编译FreeImage库,此库依赖ZLib,LIBMNG,LIBTIFF OPTION_FOUNDATIONKIT = 1 # 设置是否编译FoundationKit库 OPTION_GRAPHICSKIT = 1 #设置是否编译GraphicsKit库,此库依赖FoundationKit,LibAGG,ZLib OPTION_APPLICATIONKIT = 1 #设置是否编译ApplicationKit库,此库依赖GraphicsKit
|
还有几个库,目前还没有实现,在此也不提了。以上设置是区分大小写的,可以在该文件中设置,也可以在命令行中设置。
4.下面开始编译一个release版的static库
运行刚才创建的快捷方式,然后:
cd build\bakefiles.gen
mingw32-make -f makefile.gcc OPTION_DEBUG=0 OPTION_SHARED=0 |
编译完库后会出现一些错误,不要慌,下面我会解释的,内容如下:
g++ -o ..\..\bin\createinfo.exe mingw_s\createinfo_createinfo.o -mthreads -Wl,
--enable-runtime-pseudo-reloc -L..\..\lib -lrpcrt4 -lodbc32 -lodbccp32 -lversi
on -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole3
2 -loleaut32 -luuid -lodbc32 -lodbccp32 -lcomctl32 -lws2_32 -lopengl32 -lglu32 -
lFoundationKit_s
..\..\lib/libFoundationKit_s.a(FoundationKit_lib_StringUtils.o):StringUtils.cpp:
(.text+0x1df4): undefined reference to
..\..\lib/libFoundationKit_s.a(FoundationKit_lib_StringUtils.o):StringUtils.cpp:
(.text+0x1e25): undefined reference to
..\..\lib/libFoundationKit_s.a(FoundationKit_lib_StringUtils.o):StringUtils.cpp:
(.text+0x1e83): undefined reference to
..\..\lib/libFoundationKit_s.a(FoundationKit_lib_StringUtils.o):StringUtils.cpp:
(.text+0x1f20): undefined reference to
..\..\lib/libFoundationKit_s.a(FoundationKit_lib_StringUtils.o):StringUtils.cpp:
(.text+0x1f7e): undefined reference to
..\..\lib/libFoundationKit_s.a(FoundationKit_lib_Win32ResourceBundle.o):Win32Res
ourceBundle.cpp:(.text+0x1243): undefined reference to `GetFileVersionInfoSizeA@
8'
..\..\lib/libFoundationKit_s.a(FoundationKit_lib_Win32ResourceBundle.o):Win32Res
ourceBundle.cpp:(.text+0x12b3): undefined reference to
..\..\lib/libFoundationKit_s.a(FoundationKit_lib_Win32ResourceBundle.o):Win32Res
ourceBundle.cpp:(.text+0x22b4): undefined reference to `GetFileVersionInfoSizeW@
8'
..\..\lib/libFoundationKit_s.a(FoundationKit_lib_Win32ResourceBundle.o):Win32Res
ourceBundle.cpp:(.text+0x232c): undefined reference to
collect2: ld returned 1 exit status
mingw32-make[1]: *** [..\..\bin\createinfo.exe] Error 1
mingw32-make[1]: Leaving directory `C:/vcf-0.9.0/src/createinfo'
mingw32-make: *** [createinfo_] Error 2
其实这时VCF的所有库都已经编译完毕,在lib目录下会生成libApplicationKit_s.a, libGraphicsKit_s.a, libFoundationKit_s.a等库文件,在创建createinfo工具时出现的链接库错误
提示libFoundationKi_s.a库中FoundationKit_lib_StringUtils.o文件中未找到等函数的定义,很明显没有准确链接相关库,可该函数在librpcrt4.a库中,命令行中也链接了该库-lrpcrt4,这种错误只会出现在GCC编译器中,他与GCC编译参数顺序有关。
5.解决链接错误
下面说说gcc编译链接方式:
当g++链接多个目标文件和库文件生成可执行文件时,在某个目标文件中找到外部符号时,他会在该命令行参数后面的参数中查找该符号,依次类推,如果找不到则提示以上错误。最关键的是他不会在他前面查找,所以当他所需的外部符号定义在他前面的库中时,还是找不到。
在看看上面的错误,libFoundationKit_s.a依赖于-lrpcrt4 -lodbc32 -lodbccp32 -lversi
on -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole3
2 -loleaut32 -luuid -lodbc32 -lodbccp32 -lcomctl32 -lws2_32 -lopengl32 -lglu32
所以只需将-lFoundationKit放在他们前面就可以了。
修改文件src\createinfo\makefile.gcc第89行,将$(____createinfo_FOUNDATIONKIT_p)放在其他库前面,在编译。用同样的方法解决其他相同问题。
阅读(4430) | 评论(0) | 转发(0) |