2011年12月6日

自从上篇博文写静态编译之后,好久没再折腾静态的东西了。今天心情比较好,补充一个静态链接的博文,内容来自http://www.formortals.com/how-to-statically-link-qt-4/

 

静态编译了Qt之后,有几样东西设置了之后才能够真正将你自己的程序生成为静态的。

设置正确的Qt目录

重新编译了Qt之后,你的工程所使用的Qt目录也应当有所变化。

1、在Qt Creator中,Tools -> Options -> Qt4 选项中,将新的Qt目录添加进去

2、在工程设置中,将release的编译配置当中的Qt目录改为你添加进去的新配置

 

修改工程文件

打开你的pro文件,然后添加如下内容:

CONFIG += static
CONFIG(static) {
    CONFIG += static
    QTPLUGIN += qcncodecs
    DEFINES += STATIC
    message("Static build.")
}

这当中的qcncodecs是一个插件名,Qt静态编译之后,插件都要以这样的方式写在工程文件当中,以确保链接时能够链接进去。

注:如果不希望该选项生效,课将+=改为-=。

这里是一份相关插件名的列表:

Image formats:

  • qgif
  • qjpeg
  • qico (Windows icons)
  • qsvg (Scalable Vector Graphics)
  • qtiff

Database support:

  • qsqldb2
  • qsqlite (SQLite 3)
  • qsqlmysql
  • qsqloci (Oracle)
  • qsqlodbc
  • qsqlpsql (PostGreSQL)

Asian language codecs:

  • qcncodecs (Simplified Chinese)
  • qjpcodecs (Japanese)
  • qkrcodecs (Korean)

And finally, qtaccessiblewidgets for support of assistive technologies.

新增头文件

打开main.cpp,在顶端添加如下内容:

#ifdef STATIC
#include <QtPlugin>
Q_IMPORT_PLUGIN(qcncodecs)
#endif

每个插件都应有Q_IMPORT_PLUGIN单独一行。

 

现在一切都美好了。

posted @ 2011-12-06 12:50 liuyanghejerry 阅读(154) 评论(0) 编辑


2011年9月29日

摘要: 在Stackoverflow上看到的,上千人都在推荐这份列表,现在转载如下:Meta-ListsHow to Design Programs: An Introduction to Computing and Programming25 Free Computer Science EbooksFree Tech BooksMindView IncWikibooks: ProgrammingCheat Sheets (Free)CodePlex List of Free E-BooksBook Training - On Video!Sofware Program Managers Networ阅读全文

posted @ 2011-09-29 23:58 liuyanghejerry 阅读(62) 评论(0) 编辑


2011年9月21日

一个Linux内核模块的Hello, World。有兴趣研究Linux内核的可以以此入门。

/*
* hello.c – 本例取自《Linux Kernel Development 3rd》,稍作修改
*/
//#include <linux/init.h> //早期的Linux内核源码存在这个头文件,2.6已经不存在了
#include <linux/module.h>
#include <linux/kernel.h>

static int hello_init(void)
{
printk(KERN_ALERT “I bear a charmed life.\n”);
return 0;
}

/*
* hello_exit – the exit function, called when the module is removed.
*/
static void hello_exit(void)
{
printk(KERN_ALERT “Out, out, brief candle!\n”);
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“Your name here”);
MODULE_DESCRIPTION(“A Hello, World Module”);


相应的Makefile:

obj-m += hello.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean


在终端载入编译好的模块:

insmod hello.ko

卸载模块:

rmmod hello.ko

代码中调用了printk,但是它并不会输出至终端的屏幕,而是会输出到/var/log/kern.log当中。


posted @ 2011-09-21 18:01 liuyanghejerry 阅读(191) 评论(0) 编辑


2011年8月13日

boost是C++的一个相当强大的库,其对标准库的扩充堪称精湛到位。

一般情况下,使用boost都是在Linux发行版或者Windows之下。在Windows下,如果使用微软的C++编译器,则编译过程没有任何问题,但如果使用MinGW,则会出现一些问题。

boost官方所支持的是Cygwin,而不是MinGW。

但是有时我们需要MinGW,如果你直接按照boost手册的说法来做,那么编译时会出现找不到sys/wait.h等几个头文件的问题。这几个头文件是POSIX子系统所需要的,但是MinGW当中并没有携带。我试图直接从Linux内核源码包当中拷贝过来,但是拷贝过来的将不只是一两个头文件的问题。

因此,我们的步骤是这样的:

首先,打开MinGW的shell,

其次,我们需要在boost目录下的\tools\build\v2\engine\目录中,运行build.bat。

将由此而编译生成的,位于\tools\build\v2\engine\bin.ntx86\目录中的bjam.exe复制至boost根目录

这时,我们只要使用bjam进行编译即可。

posted @ 2011-08-13 23:16 liuyanghejerry 阅读(484) 评论(0) 编辑


2011年8月8日

背景:

华硕在很多机型当中,都搭载了一个被称为“ExpressGate”的系统,该系统允许在开机的数秒之内(官方标称是8秒)进入一个迷你操作系统,该系统可以浏览网页、浏览图片等。

实际上,该迷你操作系统是名为Splashtop的一个商业Linux操作系统的一个子版本。华硕的这一ExpressGate系统实际上根据不同机型,存在两个版本:SSD、HDD。前者将Splashtop存储于板载芯片当中,而后者则是将Splashtop存储于机器自带硬盘当中。我并没有SSD版本的机器,以下的内容均是基于HDD版本的描述。

HHD版本的ExpressGate在机器硬盘的第零个分区上(不是C盘),这一分区为FAT32格式,但被设置为了隐藏,即在Windows当中是看不到的。通过DiskGenuis,我们可以自由修改这一隐藏分区当中的内容。由于ExpressGate系统使用了一个grub程序作为引导程序,我们通过编辑其配置文件达到了启动任意操作系统的目的。

本文假设我们使用华硕 N53S,要启动一个位于USB 2.0端口所驱动的移动硬盘上的Ubuntu系统。

=================================================================

操作步骤:

提示,操作有风险,动手需谨慎,责任自己扛,和我没关系= =

修改原始menu.lst

下载DiskGenuis(http://www.diskgenius.cn/)。注意,该软件是有32位及64位区别的,如果您的计算机当前操作系统是Windwos 7 x64,必须使用64位版。

使用其进入第零块硬盘的第零个分区(hd0,0),进入ExpressGate文件夹,将menu.lst拷贝到其它位置(注意备份,必要时请备份整个隐藏分区),然后使用一个文本编辑器进行编辑。(推荐使用Notepad++,而不是Windows自带的记事本)

menu.lst原本的内容大致如下:

default saved

timeout 0

hiddenmenu

title minik

  kernel /ExpressGate/vace ro vga=0xffc i8042.reset quiet video=vesafb:ywrap,mtrr:3 acpi_backlight=vendor acpi_display_output=vendor vaKBD=us vaLANG=zh_CN fastreboot=no acpi_osi=Linux av_flag=1 rw_flag=1 debug_log=1

  initrd /ExpressGate/vace-id

title Win_1 

  savedefault 0    

  rootnoverify (hd0,0)

  chainloader +1

title Win_2

  savedefault 0

  rootnoverify (hd0,1)

  chainloader +1

title Win_3

  savedefault 0

  rootnoverify (hd0,2)

  chainloader +1

title Win_4

  savedefault 0

  rootnoverify (hd0,3)

  chainloader +1

将其整个修改为如下内容:

default saved

timeout 0

hiddenmenu

title Ubuntu 10

  root (hd0,1)

  kernel /grub.exe

title Win_1 

  savedefault 0    

  rootnoverify (hd0,0)

  chainloader +1

title Win_2

  savedefault 0

  rootnoverify (hd0,1)

  chainloader +1

title Win_3

  savedefault 0

  rootnoverify (hd0,2)

  chainloader +1

title Win_4

  savedefault 0

  rootnoverify (hd0,3)

  chainloader +1

这里面注意了,我们修改了启动项的第一个小节,这里面的root (hd0,1)表示我们要启动的程序位于第0块硬盘的的1个分区,而程序本身为grub.exe。

一般地,第0块硬盘的第1个分区,放置的都是Windows,也就是C盘。我们之所以在这里启动C盘里面的grub.exe,其实是为了通过这个grub,再引导我们的其它系统。

安装grub4dos

现在我们要在C盘当中准备一个grub。下载grub4dos(http://www.skycn.com/soft/51969.html),这里使用的版本是0.44。下载之后,grub4dos是一个压缩包,将其中的grub.exe、grldr以及menu.lst(这可不是我们刚才编辑的那个)拷贝至C盘根目录下,之后编辑menu.lst至如下内容:

timeout 0

default 0

hiddenmenu

title Ubuntu

root (hd1,0)

kernel /boot/grub/core.img

这个menu.lst会将我们所需要的系统引导起来,因此这里面的内容,实际上是根据大家自己的系统来写的,我所写的这个,意思是引导第1块硬盘的第0个分区当中的/boot/grub/core.img文件。在这之后实际上进入的是Ubuntu的grub(因为我的ubuntu用的也是grub)。

保存menu.lst,注意Windows 7会有权限问题,如果无法保存,可以先在其它位置保存,之后再覆盖过来。

关机、进入ExpressGate

完事俱全。现在关闭你的计算机,然后通过ExpressGate开机,如果一切正确,你就可以进入自己的系统了(对于我来说,就是进入了Ubuntu)。

=====================================================================================

错误排查:

Q:ExpressGate开机键打开后,只有光标在左上角闪烁。

A:你隐藏分区中的menu.lst书写有误,请检查其内容是否正确。


Q:ExpressGate开机键打开后,经过短暂的时间,进入到了一个命令后环境,左侧是grub >

A:你C盘中的menu.lst书写有误,或者你想启动的Ubuntu的grub配置书写有误。


Q:ExpressGate开机键打开后,像往常一样进入了正常的ExpressGate。

A:你没有编辑隐藏分区中的menu.lst,当中可能有一个menu.lst.bak,估计你搞错了。


Q:我玩腻了,想要原来的那个ExpressGate。

A:使用你原先备份的menu.lst,覆盖掉修改过的menu.lst。在隐藏分区中,存在一个menu.lst.bak,当你没有备份时,可以用这个改名替换。


Q:隐藏分区中内容太多,我想要进行清理。

A:如果你已经使用本文的方法,替换了ExpressGate,那么在隐藏分区的ExpressGate文件夹下,你只需要保留menu.lst以及stage2,其它的均可删除。当然,这么做之前最好备份。


Q:为什么要安装grub4dos,而不是直接引导其它系统

A:测试后发现不行。


Q:能不能给原有的ExpressGate添加软件或功能。

A:ExpressGate系统中的文件都是压缩的,我试图安装squashfs格式进行解析,遗憾的是,解析失败了。


============================================================

参考资料:

http://ubuntuforums.org/archive/index.php/t-1410167.html


posted @ 2011-08-08 20:32 liuyanghejerry 阅读(351) 评论(0) 编辑


2011年8月2日

摘要: Qt的LGPL发行版始终使用的是动态编译,因此所有的库都是动态链接的。这样做相对较为灵活,但并非十全十美——你将无法生成静态链接的程序。有人说,LGPL的版本不应该静态编译,但我觉得协议当中并没有这么说。对此,谁如果能说服我,欢迎留言。和我前几篇与编译有关的日志类似,我只是陈述一下大的步骤,不过绝大多数人都应该可以凭借这个简述开始编译。下载Qt 4.7.3地址:http://qt.nokia.com/downloads-cn。我选用的版本是官方预先准备的携带Qt Creator的版本,这个版本相对工具齐全,携带了我们需要的MinGW(对,我们要用它来编译)。如果你需要看的是有关VS上的编译,那阅读全文

posted @ 2011-08-02 15:45 liuyanghejerry 阅读(302) 评论(0) 编辑


2011年5月28日

摘要: Ogre是知名的开源3D图形引擎,其效果足以和商业引擎比肩。和Unreal这样的游戏引擎不同,Ogre并没有将一切都编译好,而是需要用户自己进行最后的编译。如果使用Windows平台,用户需要使用VS或者MinGW。网络上看了一下,VS的编译说明比较多一些,而MinGW的则比较少,而且大多时间久远,因此我自己编译了一遍,力图找到最简单、快速的方法将SDK编译起来。因为我自己也是初学,如有任何错漏之处,欢迎指出。下载解压SDK包Ogre的SDK:http://www.ogre3d.org/download/sdk下载好的SDK包解压,譬如路径C:\OgreSDK。下载安装DirectX这一步我没阅读全文

posted @ 2011-05-28 14:58 liuyanghejerry 阅读(294) 评论(0) 编辑


2011年3月23日

摘要: 虽然用C++已经有上一段时间了,但是因为练习的不够多,导致自己在很多概念的理解上都有偏差。这样的例子今天又增加了一个,特此记录,警醒自己。C++的类中的成员有三种不同的访问权限,控制外界对其成员的访问,分别是public、private、protected。一般来说,位于private当中的成员外界无法访问,哪怕是继承自父类的子类,也不可能轻易地访问到父类的private成员。但是今天注意到一个例外。那就是当本类的成员函数所接受的参数为同类对象时,该成员函数内部可以直接访问参数对象的私有成员。比如说:class A{private:int a;public:void tt(A b);};voi阅读全文

posted @ 2011-03-23 15:26 liuyanghejerry 阅读(342) 评论(0) 编辑


2011年3月19日

摘要: 以下的内容来自于http://www.cyberciti.biz/tips/compiling-linux-kernel-26.html,原文为英语,针对平台是Debian,但在Ubuntu之下依然可行。网上各种讲解编译内核的文章大多比较繁琐,但这一篇则较为简单,所以我将其意译为简体中文,加入了一些自己的理解,有兴趣的可以阅读一下。第一步,得到Linux内核源代码包。获得Linux源码的办法很多,如果你现在在windows平台之下,那么你可以访问http://kernel.org/获得内核的稳定版源码包。如果你在Ubuntu或者Debian发行版上,那么你可以用wget来获得源码包:$ cd 阅读全文

posted @ 2011-03-19 15:45 liuyanghejerry 阅读(425) 评论(0) 编辑


2010年8月19日

摘要: 上次写的那个虽然勉强能用,但是客户说啦,这个框子呀,和真正的IRC聊天框还有所不同,于是我就重写了一下。这次写的只用一个QList,应该是进一步减少了内存的占用,呵呵。/* A new LineEdit that like IRC chat*/};QIRCLineEdit::QIRCLineEdit()}阅读全文

posted @ 2010-08-19 21:14 liuyanghejerry 阅读(37) 评论(0) 编辑


posts - 21, comments - 2, trackbacks - 0, articles - 0

Copyright © liuyanghejerry