VCF的开发环境搭建

VCF的开发环境搭建
一、VCF是什么?
已经有几篇文章详细介绍了,这里我就不重复了,详细内容请了解linkman网友的 关于VCF(Visual Component Framework),关于VCF的RTII机制的分析 VCF的RTII机制,另外有官方的网站 www.vcf-online.org
 
二、为什么选择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 `UuidCreate@4'
../../lib/libFoundationKit_s.a(FoundationKit_lib_StringUtils.o):StringUtils.cpp:
(.text+0x1e25): undefined reference to `UuidToStringW@8'
../../lib/libFoundationKit_s.a(FoundationKit_lib_StringUtils.o):StringUtils.cpp:
(.text+0x1e83): undefined reference to `RpcStringFreeW@4'
../../lib/libFoundationKit_s.a(FoundationKit_lib_StringUtils.o):StringUtils.cpp:
(.text+0x1f20): undefined reference to `UuidToStringA@8'
../../lib/libFoundationKit_s.a(FoundationKit_lib_StringUtils.o):StringUtils.cpp:
(.text+0x1f7e): undefined reference to `RpcStringFreeA@4'
../../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 `GetFileVersionInfoA@16'
../../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 `GetFileVersionInfoW@16'
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文件中未找到 UuidCreate@4等函数的定义,很明显没有准确链接相关库,可该函数在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)放在其他库前面,在编译。用同样的方法解决其他相同问题。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值