Chinaunix首页 | 论坛 | 博客
  • 博客访问: 196076
  • 博文数量: 19
  • 博客积分: 1422
  • 博客等级: 上尉
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-04 17:46
文章分类

全部博文(19)

文章存档

2011年(1)

2009年(2)

2008年(9)

2007年(7)

我的朋友

分类: C/C++

2008-01-06 16:26:30

一、VCF是什么?
已经有几篇文章详细介绍了,这里我就不重复了,详细内容请了解linkman网友的关于VCF(Visual Component Framework),关于VCF的RTII机制的分析VCF的RTII机制,另外有官方的网站
 
二、为什么选择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)放在其他库前面,在编译。用同样的方法解决其他相同问题。
 
阅读(4438) | 评论(0) | 转发(0) |
0

上一篇:准备放点东西了

下一篇:用VCF编译程序

给主人留下些什么吧!~~