随笔 - 298  文章 - 377  trackbacks - 0
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(34)

随笔分类

随笔档案

文章档案

相册

收藏夹

搜索

  •  

最新评论

阅读排行榜

评论排行榜

共5页: 1 2 3 4 5 
re: [Error DarkEden] 聂文龙 2008-07-23 01:24
GamePlayer.o: In function `~GamePlayer':
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
GamePlayer.o:/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: more undefined references to `CCSAuth::~CCSAuth()' follow
GamePlayer.o: In function `GamePlayer':
/home/darkeden/src/server/gameserver/GamePlayer.cpp:85: undefined reference to `CCSAuth::CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:150: undefined reference to `CCSAuth::Init()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:153: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:85: undefined reference to `CCSAuth::CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:150: undefined reference to `CCSAuth::Init()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:153: undefined reference to `CCSAuth::~CCSAuth()'
EventAuth.o: In function `EventAuth::activate()':
/home/darkeden/src/server/gameserver/EventAuth.cpp:50: undefined reference to `CCSAuth::IsAuth()'
/home/darkeden/src/server/gameserver/EventAuth.cpp:67: undefined reference to `CCSAuth::GetAuthDword()'
../../../lib/libGameServerPackets.a(CGAuthKeyHandler.o): In function `CGAuthKeyHandler::execute(CGAuthKey*, Player*)':
/home/darkeden/src/Core/Cpackets/GS/CGAuthKeyHandler.cpp:38: undefined reference to `CCSAuth::CheckAuthDword(unsigned long)'
../../../lib/libCSAuth.a(CSAuth.o): In function `CCSAuth::~CCSAuth(void)':
CSAuth.cpp:(.text+0x9f75): undefined reference to `__builtin_delete'
../../../lib/libCSAuth.a(Crc32Mem.o): In function `CCrc32::~CCrc32(void)':
Crc32Mem.cpp:(.text+0x99): undefined reference to `__builtin_delete'
re: [Error DarkEden] 聂文龙 2008-07-22 17:08
-lCSAuth -L/usr/local/lib/mysql -static -lpthread -lnsl -lutil -ldl -lmysqlclient -llua -lz -lcppunit -rdynamic
../../../lib/libmysqlclient.a(mf_pack.o): In function `expand_tilde':
(.text+0x7b6): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
../../../lib/libmysqlclient.a(libmysql.o): In function `read_user_name':
(.text+0x653): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
../../../lib/libmysqlclient.a(mf_pack.o): In function `expand_tilde':
(.text+0x7bf): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
../../../lib/libxerces-c.a(UnixHTTPURLInputStream.o): In function `xercesc_2_8::UnixHTTPURLInputStream::UnixHTTPURLInputStream(xercesc_2_8::XMLURL const&, xercesc_2_8::XMLNetHTTPInfo const*)':
UnixHTTPURLInputStream.cpp:(.text+0xdb0): warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
UnixHTTPURLInputStream.cpp:(.text+0x6aa): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
../../../lib/libmysqlclient.a(my_gethostbyname.o): In function `my_gethostbyname_r':
(.text+0x24): warning: Using 'gethostbyname_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
../../../lib/libmysqlclient.a(libmysql.o): In function `mysql_once_init':
(.text+0x171d): warning: Using 'getservbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
Zone.o: In function `createRelicEffect(MonsterCorpse*)':
/home/darkeden/src/server/gameserver/Zone.cpp:470: undefined reference to `typeinfo for EffectHasBloodBible'
/home/darkeden/src/server/gameserver/Zone.cpp:488: undefined reference to `typeinfo for EffectHasCastleSymbol'
GamePlayer.o: In function `~GamePlayer':
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: undefined reference to `CCSAuth::~CCSAuth()'
GamePlayer.o:/home/darkeden/src/server/gameserver/GamePlayer.cpp:336: more undefined references to `CCSAuth::~CCSAuth()' follow
GamePlayer.o: In function `GamePlayer':
/home/darkeden/src/server/gameserver/GamePlayer.cpp:85: undefined reference to `CCSAuth::CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:150: undefined reference to `CCSAuth::Init()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:153: undefined reference to `CCSAuth::~CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:85: undefined reference to `CCSAuth::CCSAuth()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:150: undefined reference to `CCSAuth::Init()'
/home/darkeden/src/server/gameserver/GamePlayer.cpp:153: undefined reference to `CCSAuth::~CCSAuth()'
CastleInfoManager.o: In function `CastleInfoManager::hasOtherBloodBible(unsigned short, PlayerCreature*) const':
/home/darkeden/src/server/gameserver/CastleInfoManager.cpp:815: undefined reference to `typeinfo for EffectHasBloodBible'
EffectGrandMasterVampire.o: In function `EffectGrandMasterVampire':
/home/darkeden/src/server/gameserver/EffectGrandMasterVampire.cpp:18: undefined reference to `vtable for EffectGrandMasterVampire'
/home/darkeden/src/server/gameserver/EffectGrandMasterVampire.cpp:18: undefined reference to `vtable for EffectGrandMasterVampire'
EffectHasBloodBible.o: In function `EffectHasBloodBible':
/home/darkeden/src/server/gameserver/EffectHasBloodBible.cpp:43: undefined reference to `vtable for EffectHasBloodBible'
/home/darkeden/src/server/gameserver/EffectHasBloodBible.cpp:43: undefined reference to `vtable for EffectHasBloodBible'
/home/darkeden/src/server/gameserver/EffectHasBloodBible.cpp:32: undefined reference to `vtable for EffectHasBloodBible'
/home/darkeden/src/server/gameserver/EffectHasBloodBible.cpp:32: undefined reference to `vtable for EffectHasBloodBible'
EffectHasCastleSymbol.o: In function `EffectHasCastleSymbol':
/home/darkeden/src/server/gameserver/EffectHasCastleSymbol.cpp:56: undefined reference to `vtable for EffectHasCastleSymbol'
/home/darkeden/src/server/gameserver/EffectHasCastleSymbol.cpp:56: undefined reference to `vtable for EffectHasCastleSymbol'
/home/darkeden/src/server/gameserver/EffectHasCastleSymbol.cpp:45: undefined reference to `vtable for EffectHasCastleSymbol'
/home/darkeden/src/server/gameserver/EffectHasCastleSymbol.cpp:45: undefined reference to `vtable for EffectHasCastleSymbol'
EffectShareHP.o: In function `EffectShareHP':
/home/darkeden/src/server/gameserver/EffectShareHP.cpp:21: undefined reference to `vtable for EffectShareHP'
/home/darkeden/src/server/gameserver/EffectShareHP.cpp:21: undefined reference to `vtable for EffectShareHP'
EventAuth.o: In function `EventAuth::activate()':
/home/darkeden/src/server/gameserver/EventAuth.cpp:50: undefined reference to `CCSAuth::IsAuth()'
/home/darkeden/src/server/gameserver/EventAuth.cpp:67: undefined reference to `CCSAuth::GetAuthDword()'
../../../lib/libGameServerPackets.a(CGAuthKeyHandler.o): In function `CGAuthKeyHandler::execute(CGAuthKey*, Player*)':
/home/darkeden/src/Core/Cpackets/GS/CGAuthKeyHandler.cpp:38: undefined reference to `CCSAuth::CheckAuthDword(unsigned long)'
../../../lib/libSkill.a(SkillUtil.o): In function `setDamage(Creature*, unsigned short, Creature*, unsigned short, ModifyInfo*, ModifyInfo*, bool, bool)':
/home/darkeden/src/server/gameserver/skill/SkillUtil.cpp:2634: undefined reference to `typeinfo for EffectShareHP'
../../../lib/libCSAuth.a(CSAuth.o): In function `CCSAuth::~CCSAuth(void)':
CSAuth.cpp:(.text+0x9f75): undefined reference to `__builtin_delete'
../../../lib/libCSAuth.a(Crc32Mem.o): In function `CCrc32::~CCrc32(void)':
Crc32Mem.cpp:(.text+0x99): undefined reference to `__builtin_delete'
../../../lib/liblua.a(loadlib.o): In function `ll_loadfunc':
loadlib.c:(.text+0x917): undefined reference to `dlsym'
loadlib.c:(.text+0x924): undefined reference to `dlerror'
loadlib.c:(.text+0x9fc): undefined reference to `dlopen'
loadlib.c:(.text+0xa11): undefined reference to `dlerror'
../../../lib/liblua.a(loadlib.o): In function `gctm':
loadlib.c:(.text+0x101e): undefined reference to `dlclose'
collect2: ld 返回 1

MySQL-client-4.0.18-0.i386(1).rpm MySQL-server-4.0.18-0.i386(2).rpm
MySQL-client-4.0.18-0.i386.rpm MySQL-server-4.0.18-0.i386(3).rpm
MySQL-devel-4.0.18-0.i386(1).rpm MySQL-server-4.0.18-0.i386.rpm
MySQL-devel-4.0.18-0.i386.rpm MySQL-shared-compat-4.0.18-0.i386.rpm
MySQL-server-4.0.18-0.i386(1).rpm mysql-standard-4.0.18-pc-linux-i686.tar.gz
[root@localhost 4.0.18]# rpm -ivh MySQL-devel-4.0.18-0.i386.rpm
Preparing... ########################################### [100%]
1:MySQL-devel ########################################### [100%]
[root@localhost 4.0.18]# cd /home/darkeden/src
[root@localhost src]# cd /home/soft/mysql
[root@localhost mysql]# cd 4.018
bash: cd: 4.018: 没有那个文件或目录
[root@localhost mysql]# cd 4.0.18
[root@localhost 4.0.18]# ;s
bash: syntax error near unexpected token `;'
[root@localhost 4.0.18]# ls
MySQL-client-4.0.18-0.i386(1).rpm MySQL-devel-4.0.18-0.i386.rpm MySQL-server-4.0.18-0.i386(3).rpm mysql-standard-4.0.18-pc-linux-i686.tar.gz
MySQL-client-4.0.18-0.i386.rpm MySQL-server-4.0.18-0.i386(1).rpm MySQL-server-4.0.18-0.i386.rpm
MySQL-devel-4.0.18-0.i386(1).rpm MySQL-server-4.0.18-0.i386(2).rpm MySQL-shared-compat-4.0.18-0.i386.rpm
[root@localhost 4.0.18]# rpm -ivh MySQL-client-4.0.18-0.i386.rpm
Preparing... ########################################### [100%]
1:MySQL-client ########################################### [100%]
[root@localhost 4.0.18]# rpm -ivh MySQL-server-4.0.18-0.i386.rpm
Preparing... ########################################### [100%]
1:MySQL-server ########################################### [100%]
Preparing db table
Preparing host table
Preparing user table
Preparing func table
Preparing tables_priv table
Preparing columns_priv table
Installing all prepared tables
080719 21:01:48 /usr/sbin/mysqld: Shutdown Complete


PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'
See the manual for more instructions.

Please report any problems with the /usr/bin/mysqlbug script!

The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at https://order.mysql.com

[root@localhost 4.0.18]#
1、找到相应的软件包,比如soft.tar.bz2,下载到本机某个目录;

2、打开一个终端,su -成root用户;

3、cd soft.tar.bz2所在的目录;

4、tar -xjvf soft.tar.bz2 //一般会生成一个soft目录

5、cd soft

6、./configure

7、make

8、make install
re: Linux平台下安装code::blocks 聂文龙 2008-07-17 17:18
1、下载并编译wxWidgets
(1)登录 http://www.wxwidgets.org/downloads/ 下载最新的wxWidgets源码包,如wxWidgets-2.8.8.tar.bz2

(2)编译wxWidgets,将下载的wxWidgets-2.8.8.tar.bz2解压后,进入刚刚生成的wxWidgets-2.8.8文件夹,新建一个名为static_unicode_build的文件夹,并在终端中进入static_unicode_build文件夹,输入代码:.. /configure --enable-shared --enable-monolithic --with-gtk=2 --with-libpng=builtin --with-zlib=builtin --with-expat=builtin --with-libtiff=builtin --with-regex=builtin --with-libjpeg=builtin --enable-unicode /*注意是../configure,有两个点开头,表示上级目录

(3)如果第(2)步成功后,输入代码:make

(4)输入代码:make install
re: Linux修改IP和DNS 聂文龙 2008-07-13 00:10
配置文件位于:
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.3
NETMASK=255.255.255.0
GATEWAY=192.168.0.1

使IP地址生效:
/sbin/ifdown eth0
/sbin/ifup eth0

配置dns解析
echo "nameserver 211.98.1.28">> /etc/resolv.conf

通知网关更新信息:
/etc/init.d/network restart
#./mysqladmin -h 127.0.0.1 -u root -p shutdown (回車)
然後系統將提示輸入密碼,輸入mysql數據庫的root即可
编译安装mysql4.0.26,为了保证所所有的重要数据全部都在/var分区下,需要手工指定mysql的默认数据库的路径。
查看了一下:
./configure --help发现里面有个:
--datadir=DIR read-only architecture-independent data [PREFIX/share]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
由于数据库默认应该是保存在PREFIX/var下面的,根据上面这个提示,应该是设置
--localstatedir这个选项,于是:
./configure
--localstatedir=/var/mysql
--prefix=/usr/local/mysql
--with-mysqld-user=mysql /制定mysql的daemon的user
--with-big-tables /启用对大于4G的数据库的支持
make
make install
cp support-files/my-medium.cnf /etc/my.cnf
bin/mysql_install_db --user=mysql
发现/var路径下生成了mysql_db目录,说明指定此参数正确,OK!
2008-05-23 13:09//下载png扩展库
# wget ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.2.10.tar.bz2
//下载tiff扩展库
# wget ftp://ftp.remotesensing.org/pub/libtiff/tiff-3.8.2.tar.gz
//下载curl扩展库
# wget http://curl.haxx.se/download/curl-7.15.3.tar.gz
//下载libiconv扩展库
# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.2.tar.gz
//
# wget http://www.boutell.com/gd/http/gd-2.0.33.tar.gz
//
# wget http://savannah.nongnu.org/download/freetype/freetype-2.1.10.tar.gz
//
# wget ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
//
# wget http://switch.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.8.tar.gz
//
# wget http://www.openssl.org/source/openssl-0.9.7g.tar.gz
//
# wget ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.3.tar.gz
//
# wget http://www.zlib.net/zlib-1.2.2.tar.gz
//
# wget http://www.fastio.com/clibpdf202r1.tar.gz

(1) 安装zlib
# tar zxvf zlib-1.2.2.tar.gz
# cd zlib-1.2.2
# ./configure
# make
# make install

(2) 安装libpng
# tar zxvf libpng-1.2.7.tar.tar
# cd libpng-1.2.7
# cd scripts/
# mv makefile.linux ../makefile
# cd ..
# make
# make install
注意,这里的makefile不是用./configure生成,而是直接从scripts/里复制一个。

(3) 安装freetype
# tar zxvf freetype-2.1.9.tar.gz
# cd freetype-2.1.9
# ./configure
# make
# make install

(4) 安装Jpeg
# mkdir /usr/local/jpeg
# mkdir /usr/local/jpeg/bin
# mkdir /usr/local/jpeg/lib
# mkdir /usr/local/jpeg/include
# mkdir /usr/local/jpeg/man
# mkdir /usr/local/jpeg/man/man1

# tar zxvf jpegsrc.v6b.tar.gz
# cd jpeg-6b/
# ./configure --prefix=/usr/local/jpeg/ --enable-shared -enable-static
# make
# make test
# make install
注意:这里configure一定要带--enable-shared参数,不然,不会生成共享库

(5)安装GD
# tar zxvf gd-2.0.33.tar.gz
# cd gd-2.0.33
# ./configure --with-png --with-freetype --with-jpeg
# make install

(6)tiff 扩展库安装
//直接拷贝如下指令,进行操作
# ./configure --prefix=/usr/local/tiff
# make
# su
# make install

(7)openssl 扩展库安装
# 直接拷贝如下指令,进行操作
# ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl
# make
# make install

(8)CURL 扩展库安装
# ./configure --prefix=/usr/local/curl
# make
# make install

//mysql 安装
./configure
--prefix=/usr/local/mysql 指定mysql安装目录
--localstatedir=/usr/local/mysql/data 指定mysql数据存在目录
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock 指定mysql的sock连接文件存在目录
--with-client-ldflags=-all-static
--with-mysqld-ldflags=-all-static
--with-charset=gb2312 指定mysql数据库字符集


//直接拷贝如下指令,进行操作
# ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --with-charset=gb2312

//apache 安装
//./configure
//--prefix=/usr/local/apache 指定apache安装目录
//--with-mysql=/usr/local/mysql/ 指定mysql数据库目录
//--with-config-file-path=/usr/local/apache/conf //指定apache配置文件目录
//--with-ssl=/usr/local/ssl //指定openssl扩展库安装目录
//--with-mpm=worker 加载MPM多道处理模块
//--enable-so
//--enable-cgi
//--enable-track-vars
//--enable-mods-shared=all
//--enable-cache
//--enable-disk-cache
//--enable-mem-cache
//--enable-rewrite
//--enable-ssl


//直接拷贝如下指令,进行操作
# ./configure --prefix=/usr/local/apache2 --with-mysql=/usr/local/mysql/ --with-config-file-path=/usr/local/apache2/conf --with-ssl=/usr/local/ssl --with-mpm=worker --enable-so --enable-cgi --enable-track-vars --enable-mods-shared=all --enable-cache --enable-disk-cache --enable-mem-cache --enable-rewrite --enable-ssl
# make
# make install

//编辑 httpd.conf 文件以调用 PHP 模块。LoadMolude 表达式右边的路径必须指向系统中的 PHP。以上的 make install 命令可能已经完成了这些,但务必要检查。
对于 PHP 4:
LoadModule php4_module modules/libphp4.so
对于 PHP 5:
LoadModule php5_module modules/libphp5.so

# chcon /usr/local/apache/modules/libphp5.so -t shlib_t

//告知 Apache 将特定的扩展名解析成 PHP,例如,让 Apache 将扩展名 .php 解析成 PHP。可以将任何扩展名指定为 PHP,只需添加它们,每一个用空格分隔。例如,要添加 .phtml:
AddType application/x-httpd-php .php .phtml
//通常还将 .phps 扩展名设置成显示高亮的 PHP 源文件,可以这样来完成:
AddType application/x-httpd-php-source .phps

//启动 Apache 服务器
# usr/local/apache2/bin/apachectl start


rpm -ivh /home/download/LinuxSoftware/rpms/flex-2.5.4a-27.i386.rpm


//PHP 的安装
./configure --prefix=/usr/local/php 指定PHP安装目录
--with-apxs2=/usr/local/apache/bin/apxs 指定apache指令存在目录
--with-config-file-path=/usr/local/apache/conf 指定配制文件存在目录
--with-mysql=/usr/local/mysql 指定mysql存在目录
--with-mysql-sock=/usr/local/mysql/tmp/mysql.sock 指定mysql的sock连接文件存在目录
--with-gd=/usr/local/gd 指定gd库安装目录
--with-jpeg-dir=/usr/local/jpeg 指定jpeg库安装目录
--with-png-dir=/usr/local 指定png安装目录
--with-tiff-dir=/usr/local/tiff 指定tiff安装目录
--with-freetype-dir=/usr/local/freetype 指定freetype安装目录
--with-openssl=/usr/local/ssl 指定ssl安装目录
--with-pear=/usr/local/php/pear 指定php扩展对象库存在目录
--with-curl=/usr/local/curl 指定curl安装目录
--with-iconv=/usr/local/iconv 指定iconv安装目录
--with-zlib=/usr/local/zlib 指定zlib安装目录
--with-curlwrappers
--with-iconv
--with-mbstring
--enable-so
--enable-magic-quotes
--enable-gd
--enable-mbstring
--enable-track-vars
--enable-force-cgi-redirect
--enable-ftp
--enable-wddx

//直接拷贝如下指令,进行操作
# ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/usr/local/apache2/conf --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-gd=/usr/local/gd --with-jpeg-dir=/usr/local/jpeg --with-png-dir=/usr/local/libpng --with-tiff-dir=/usr/local/tiff --with-freetype-dir=/usr/local/freetype --with-pear=/usr/local/php/pear --with-curl=/usr/local/curl --with-iconv=/usr/local/iconv --with-zlib=/usr/local/zlib --with-libxml-dir=/usr/local/libxml2/ --with-curlwrappers --with-iconv --with-mbstring --enable-so --enable-magic-quotes --enable-gd --enable-track-vars --enable-force-cgi-redirect --enable-wddx

re: 在Linux下安装和使用MySQL 聂文龙 2008-06-23 21:15

/*
MySQL Data Transfer
Source Host: localhost
Source Database: darkeden
Target Host: localhost
Target Database: darkeden
Date: 2008-6-23 下午 09:13:39
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for GuildInfo
-- ----------------------------
DROP TABLE IF EXISTS `GuildInfo`;
CREATE TABLE `guildinfo` (
  `GuildID` int(10) unsigned NOT NULL default '0',
  `GuildName` varchar(6) NOT NULL default '',
  `GuildType` tinyint(3) unsigned NOT NULL default '0',
  `GuildRace` tinyint(3) unsigned NOT NULL default '0',
  `GuildState` tinyint(3) unsigned NOT NULL default '0',
  `ServerGroupID` tinyint(3) unsigned NOT NULL default '0',
  `GuildZoneID` smallint(5) unsigned NOT NULL default '0',
  `Master` varchar(3) NOT NULL default '',
  `MemberCount` int(10) unsigned NOT NULL default '0',
  `Date` varchar(3) NOT NULL default '',
  `Fame` int(10) unsigned NOT NULL default '0',
  `Notoriety` int(10) unsigned NOT NULL default '0',
  `Gold` int(10) unsigned NOT NULL default '0',
  `Intro` text NOT NULL,
  UNIQUE KEY `GuildInfo_u1` (`GuildID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

re: GCC-2.95.3 聂文龙 2008-06-20 09:35
pkg://compat-gcc-295-7.2-2.95.3.78.src.rpm:13011636/compat-gcc-295.spec  info  downloads

%define _enable_debug_packages 0
%define debug_package %{nil}
Summary: The GNU Compiler Collection for Red Hat Linux 7.1/s390x and 7.2/s390 compatibility
Name: compat-gcc-295
Version: 7.2
Release: 2.95.3.78
Copyright: GPL
Group: Development/Languages
Source: gcc-2.95.3.tar.gz
Patch1: gcc-2.95.3-s390.patch
Patch2: gcc-2.95.3-s390-1.patch
Patch3: gcc-2.95.3-s390-2.patch
Patch4: gcc-2.95.3-s390-3.patch
Patch5: gcc-2.95.3-s390-4.patch
Patch6: gcc-2.95.3-s390-5.patch
Patch13: gcc-2.95.3-glibc224.patch
Patch14: gcc-2.95.3-libio.patch
Patch18: gcc-2.95.3-s390-undef.patch
Patch50: gcc-2.95.3-libgcc_s.patch
Patch51: gcc-2.95.3-s390x.patch
Patch52: gcc-2.95.3-libstdc++-libc-interface.patch
Patch53: gcc-2.95.3-udivwsdiv.patch
URL: http://gcc.gnu.org
BuildRoot: /var/tmp/%{name}-root
%ifnarch s390
Requires: binutils >= 2.9.5.0.41
%endif
Requires: glibc-devel
Prereq: /sbin/install-info
ExclusiveArch: s390 s390x
%description
This package is not created.
%package -n compat-libstdc++
Summary: Standard C++ libraries for Red Hat 7.1/s390x and 7.2/s390 backwards compatibility
Group: System Environment/Libraries
Requires: libgcc, libstdc++ >= 3.2
%description -n compat-libstdc++
The libstdc++ package contains a snapshot of the GCC Standard C++
Library v3, an ongoing project to implement the ISO 14882 Standard C++
library.
%prep
%setup -q -n gcc-2.95.3
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch13 -p1
%patch14 -p0
%patch18 -p1
%patch50 -p0
%patch51 -p0
%patch52 -p0
%ifarch s390
%patch53 -p0
%endif
%build
%ifarch s390
# ssize_t used to be int in the very early days
echo '#ifndef _G_config_h' > libio/_G_config.h
echo '#include_next <_G_config.h>' >> libio/_G_config.h
echo '#undef _G_ssize_t' >> libio/_G_config.h
echo '#define _G_ssize_t int' >> libio/_G_config.h
echo '#endif' >> libio/_G_config.h
%endif
%ifarch s390x
# 2002-10-23 glibc changes made off64_t long long instead of long
echo '#ifndef _G_config_h' > libio/_G_config.h
echo '#include_next <_G_config.h>' >> libio/_G_config.h
echo '#undef _G_off64_t' >> libio/_G_config.h
echo 'typedef long int __gcc295_off64_t;' >> libio/_G_config.h
echo '#define _G_off64_t __gcc295_off64_t' >> libio/_G_config.h
echo '#endif' >> libio/_G_config.h
%endif
find . -name configure | xargs touch
rm -rf obj-$RPM_ARCH-linux
mkdir obj-$RPM_ARCH-linux
cd obj-$RPM_ARCH-linux
../configure  --prefix=/usr \
--enable-shared --enable-threads \
--enable-languages=c,c++ \
--enable-cpp \
$RPM_ARCH-redhat-linux
PATH=$PATH:/sbin:/usr/sbin
touch  ../gcc/c-gperf.h
make MAKEINFO="makeinfo --no-split"  bootstrap-lean
%install
rm -rf $RPM_BUILD_ROOT
cd obj-$RPM_ARCH-linux
PATH=$PATH:/sbin:/usr/sbin
make install \
prefix=$RPM_BUILD_ROOT%{_prefix} \
mandir=$RPM_BUILD_ROOT%{_mandir} \
infodir=$RPM_BUILD_ROOT%{_infodir} \
MAKEINFO="makeinfo --no-split"
rm -rf $RPM_BUILD_ROOT%{_bindir} $RPM_BUILD_ROOT%{_mandir}
rm -rf $RPM_BUILD_ROOT%{_infodir} $RPM_BUILD_ROOT%{_includedir}
rm -rf $RPM_BUILD_ROOT%{_prefix}/s390*
rm -rf $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib
rm -f $RPM_BUILD_ROOT%{_prefix}/lib/*.a
%ifarch s390x
mkdir -p $RPM_BUILD_ROOT%{_prefix}/lib64
mv -f $RPM_BUILD_ROOT%{_prefix}/lib/lib*so* $RPM_BUILD_ROOT%{_prefix}/lib64/
%endif
echo '' | gcc $RPM_OPT_FLAGS -nostdlib -shared -fpic -xc - \
-o $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libstdc++-3-libc6.1-2-2.10.0.so \
-Wl,-soname,libstdc++-libc6.1-2.so.3 -L$RPM_BUILD_ROOT%{_prefix}/%{_lib} \
-lstdc++-3-libc6.2-2-2.10.0
strip -g -R .comment $RPM_BUILD_ROOT%{_prefix}/%{_lib}/lib*.so
/sbin/ldconfig -n $RPM_BUILD_ROOT%{_prefix}/%{_lib}
%clean
rm -rf $RPM_BUILD_ROOT
%post -n compat-libstdc++ -p /sbin/ldconfig
%postun -n compat-libstdc++ -p /sbin/ldconfig
%files -n compat-libstdc++
%defattr(-,root,root)
%doc README* COPYING COPYING.LIB
%{_prefix}/%{_lib}/libstdc++*libc6.*.so*
%changelog
* Thu Nov  6 2003 Jakub Jelinek <jakub@redhat.com> 7.2-2.95.3.78
- force __udiv_w_sdiv from libgcc.a into libstdc++.so on s390
(#109061)
* Wed Sep 17 2003 Jakub Jelinek <jakub@redhat.com> 7.2-2.95.3.77
- changed BuildRoot so that it doesn't clash with normal gcc
- remove %%{_smp_mflags}, makefiles apparently aren't ready for -jN
* Tue Sep 16 2003 Phil Knirsch <pknirsch@redhat.com> 7.2-2.95.3.76
- Added gcc-2.95.3-s390-4 and gcc-2.95.3-s390-5 patches from IBM.
* Wed Sep 10 2003 Jakub Jelinek <jakub@redhat.com> 7.2-2.95.3.75
- include libstdc++-3-libc6.1-2.so.3 stub library
* Mon Sep  8 2003 Jakub Jelinek <jakub@redhat.com> 7.2-2.95.3.74
- use int ssize_t on s390 and long int off64_t on s390x so that
name mangling is identical
- strip the library
* Mon Sep  8 2003 Jakub Jelinek <jakub@redhat.com> 7.2-2.95.3.73
- changed into compatibility package
- link libstdc++ against libgcc_s.so.1
* Tue Mar 19 2002 Phil Knirsch <pknirsch@redhat.com>
- Added latest official IBM gcc patch (gcc-2.95.3-s390-3).
* Fri Feb 08 2002 Phil Knirsch <pknirsch@redhat.com>
- Reenabled glibc224 patch as we are using glibc 2.2.4 now for 7.1
* Thu Jan 31 2002 David Sainty <dsainty@redhat.com> 2.95.3-0.71.2sx
- add in gcc-2.95.2-bogushack-s390x patch to fix cpp compiles
* Thu Jan 31 2002 David Sainty <dsainty@redhat.com>
- disable glibc224 patch - we don't have glibc-2.2.4 on 7.1
* Wed Oct 24 2001 Karsten Hopp <karsten@redhat.de>
- add -undef patch to ignore unsupported flag
* Tue Oct 16 2001 David Sainty <dsainty@redhat.com>
- use 2.95.3 with following patches:
- s390 and s390-1 and s390-2 (v.recent) IBM patches
- glibc224 and libio patches
* Sat Dec 09 2000 Florian La Roche <Florian.LaRoche@redhat.de>
- use 2.95.2 with the following patches:
- current head of cvs
- S390 patch from IBM: gcc-2.95.2.4
- spec file is based on the standard Red Hat Linux 7 one plus
a version ported from Red Hat Linux 6.2 to S390 by
- Oliver Paukstadt <opaukstadt@millenux.com>
- Fritz Elfert <felfert@to.com>
re: GCC-2.95.3 聂文龙 2008-06-20 09:23
This is the rpm package of gcc 2.95.3 plus some patches compiled for
RedHat 6.2. Both source and x86 binary rpms are provided. They are
available at
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-2.95.3-0.20000503.1.src.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/cpp-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-c++-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-chill-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-g77-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-java-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-libgcj-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/libstdc++-2.95.2-2.10.0-0.5.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-objc-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/libstdc++-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/libstdc++-compat-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/libstdc++-devel-2.95.3-0.20000503.1.i386.rpm
CAUTION: If you are writing any C++ programs, you may have to recompile
all of your C++ libraries, which don't come with gcc 2.95.3, with the new
compiler since C++ ABI is changed in gcc 2.95.3. One example is Qt. The
existing C++ binaries are not affected.
You can also compile it for libc 5. But you need to unpack the source
rpm and edit gcc.spec to enable
%define libc5 1
%define target_alias i386-pc-linux-gnulibc1
%define GCC_PREFIX /opt/%{target_alias}
Then rebuild it for libc 5.
The x86 libc5 cross binary rpms for glibc 2 are
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-libc5-2.95.3-0.20000503.1.src.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-libc5-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-libc5-c++-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-libc5-objc-2.95.3-0.20000503.1.i386.rpm
ftp://ftp.varesearch.com/pub/support/hjl/gcc/gcc-2.95.x/gcc-libc5-g77-2.95.3-0.20000503.1.i386.rpm
You may need to add
/opt/i386-pc-linux-gnulibc1/i386-pc-linux-gnulibc1/lib
to /etc/ld.so.conf before
/usr/i486-linux-libc5/lib
and run ldconfig so that those shared libraries can be found
by the dynamic linker. Or you can add
/opt/i386-pc-linux-gnulibc1/i386-pc-linux-gnulibc1/lib
to LD_LIBRARY_PATH and export LD_LIBRARY_PATH.
H.J. Lu
hjl@valinux.com
05/03/2000
re: 学习打补丁... 聂文龙 2008-06-18 22:53
libstdc++/95: bastring.h's c_str implementation prohibits charT's other than char
To: libstdc++-gnats at sourceware dot cygnus dot com
Subject: libstdc++/95: bastring.h's c_str implementation prohibits charT's other than char
From: ben at valinux dot com
Date: 6 Oct 2000 18:21:56 -0000
Reply-To: ben at valinux dot com
Resent-Cc: libstdc++-prs at sourceware dot cygnus dot com
Resent-Reply-To: libstdc++-gnats@sourceware.cygnus.com, ben@valinux.com

--------------------------------------------------------------------------------


>Number: 95
>Category: libstdc++
>Synopsis: bastring.h's c_str implementation prohibits charT's other than char
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Fri Oct 06 11:27:00 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: ben@valinux.com
>Release: 2.95.2-13
>Organization:
>Environment:
debian potato
>Description:
The problem is that when you define use a template parameter for "charT"
for bastring as anything different than "char" the type that you pass in as the
template parameter doesn't match "" which is always of type "char*" when
g++ compiles the bastring.h header file.



>How-To-Repeat:
Try something like this:

#include <string>

int main()
basic_string<unsigned char> foo;
foo.c_str();
}
>Fix:
--- /usr/include/g++-3/std/bastring.h Fri Jul 7 02:10:00 2000
+++ bastring.h Fri Oct 6 10:55:14 2000
@@ -332,7 +332,7 @@

public:
const charT* c_str () const
- { const charT* null_str = "";
+ { static const charT null_str[1]={0};
if (length () == 0) return null_str; terminate (); return data (); }
void resize (size_type n, charT c);
void resize (size_type n)
>Release-Note:
>Audit-Trail:
>Unformatted:

re: 【CppUnit】快速入门 聂文龙 2008-06-18 17:46
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>


#include "complex.h"
class complexNumberTest : public CppUnit::TestFixture {
private:
long_double_complex *m_10_1,*m_1_1,*m_11_2;
protected:
void setUp()
{
m_10_1 = new long_double_complex( 10, 1 );
m_1_1 = new long_double_complex( 1, 1 );
m_11_2 = new long_double_complex( 11, 2 );
}

void tearDown()
{
delete m_10_1;
delete m_1_1;
delete m_11_2;
}

void testEquality()
{
CPPUNIT_ASSERT( *m_10_1 == *m_10_1 );
CPPUNIT_ASSERT( !(*m_10_1 == *m_11_2) );
}
public:
complexNumberTest(){}
/* void testAddition()
{
CPPUNIT_ASSERT( *m_10_1 + *m_1_1 == *m_11_2 );
}*/
};

int main( void)
{

CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest( registry.makeTest() );
bool wasSucessful = runner.run( "", false );
return wasSucessful;

}



[root@localhost cppunit-test]# g++ -L/usr/local b -I/usr/local/include test1.cpp -o test1
/tmp/cccaLfPs.o(.text+0x12): In function `main':
: undefined reference to `CppUnit::TextUi::TestRunner::TestRunner(CppUnit::Outputter *)'
/tmp/cccaLfPs.o(.text+0x1a): In function `main':
: undefined reference to `CppUnit::TestFactoryRegistry::getRegistry(void)'
/tmp/cccaLfPs.o(.text+0x44): In function `main':
: undefined reference to `CppUnit::TextUi::TestRunner::addTest(CppUnit::Test *)'
/tmp/cccaLfPs.o(.text+0x7f): In function `main':
: undefined reference to `CppUnit::TextUi::TestRunner::run(basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> >, bool, bool, bool)'
/tmp/cccaLfPs.o(.text+0x99): In function `main':
: undefined reference to `CppUnit::TextUi::TestRunner::~TestRunner(void)'
/tmp/cccaLfPs.o(.text+0xc0): In function `main':
: undefined reference to `CppUnit::TextUi::TestRunner::~TestRunner(void)'
collect2: ld returned 1 exit status
[root@localhost cppunit-test]#
re: 【CppUnit】快速入门 聂文龙 2008-06-18 16:27
你可以链接静态库也可以链接静态库。
(a) 链接静态库。编译命令:
g++ -L/usr/local/lib/libcppunit.a mytest.cpp -lcppunit -ldl -o mytest

运行:
./mytest

结果:
Test::testHelloWorldHello, world!
: OK

(b) 链接动态库。编译命令:
g++ mytest.cpp -lcppunit -ldl -o mytest

运行:
./mytest
结果:
Test::testHelloWorldHello, world!
: OK

如果你没有执行步骤(5),那么你也可以在每次运行之前设置下临时的环境变量LD_LIBRARY_PATH命令如下:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
re: 【CppUnit】快速入门 聂文龙 2008-06-18 15:53

便利的开发工具 CppUnit 快速使用指南

CppUnit 是个基于 LGPL 的开源项目,最初版本移植自 JUnit,是一个非常优秀的开源测试框架。CppUnit 和 JUnit 一样主要思想来源于极限编程(XProgramming)。主要功能就是对单元测试进行管理,并可进行自动化测试。这样描述可能没有让您体会到测试框架的强大威力,那您在开发过程中遇到下列问题吗?如果答案是肯定的,就应该学习使用这种技术:

测试代码没有很好地维护而废弃,再次需要测试时还需要重写;
投入太多的精力,找 bug,而新的代码仍然会出现类似 bug;
写完代码,心里没底,是否有大量 bug 等待自己;
新修改的代码不知道是否影响其他部分代码;
由于牵扯太多,导致不敢进行修改代码;
...
这些问题下文都会涉及。这个功能强大的测试框架在国内的 C++ 语言开发人员中使用的不是很多。本文从开发人员的角度,介绍这个框架,希望能够使开发人员用最少的代价尽快掌握这种技术。下面从基本原理,CppUnit 原理,手动使用步骤,通常使用步骤,其他实际问题等方面进行讨论。以下讨论基于 CppUnit1.8.0。

1. 基本原理

对于上面的问题仅仅说明 CppUnit 的使用是没有效果的,下面先从测试的目的,测试原则等方面简要说明,然后介绍 CppUnit 的具体使用。

首先要明确我们写测试代码的目的,就是验证代码的正确性或者调试 bug。这样写测试代码时就有了针对性,对那些容易出错的,易变的编写测试代码;而不用对每个细节,每个功能编写测试代码,当然除非有过量精力或者可靠性要求。

编码和测试的关系是密不可分的,推荐的开发过程并不要等编写完所有或者很多的代码后再进行测试,而是在完成一部分代码,比如一个函数,之后立刻编写测试代码进行验证。然后再写一些代码,再写测试。每次测试对所有以前的测试都进行一遍。这样做的优点就是,写完代码,也基本测试完一遍,心里对代码有信心。而且在写新代码时不断地测试老代码,对其他部分代码的影响能够迅速发现、定位。不断编码测试的过程也就是对测试代码维护的过程,以便测试代码一直是有效的。有了各个部分测试代码的保证,有了自动测试的机制,更改以前的代码没有什么顾虑了。在极限编程(一种软件开发思想)中,甚至强调先写测试代码,然后编写符合测试代码的代码,进而完成整个软件。

根据上面说的目的、思想,下面总结一下平时开发过程中单元测试的原则:

先写测试代码,然后编写符合测试的代码。至少做到完成部分代码后,完成对应的测试代码;
测试代码不需要覆盖所有的细节,但应该对所有主要的功能和可能出错的地方有相应的测试用例;
发现 bug,首先编写对应的测试用例,然后进行调试;
不断总结出现 bug 的原因,对其他代码编写相应测试用例;
每次编写完成代码,运行所有以前的测试用例,验证对以前代码影响,把这种影响尽早消除;
不断维护测试代码,保证代码变动后通过所有测试;
有上面的理论做指导,测试行为就可以有规可循。那么 CppUnit 如何实现这种测试框架,帮助我们管理测试代码,完成自动测试的?下面就看看 CppUnit 的原理。

2. CppUnit 的原理

在 CppUnit 中,一个或一组测试用例的测试对象被称为 Fixture(设施,下文为方便理解尽量使用英文名称)。Fixture 就是被测试的目标,可能是一个对象或者一组相关的对象,甚至一个函数。

有了被测试的 fixture,就可以对这个 fixture 的某个功能、某个可能出错的流程编写测试代码,这样对某个方面完整的测试被称为TestCase(测试用例)。通常写一个 TestCase 的步骤包括:

对 fixture 进行初始化,及其他初始化操作,比如:生成一组被测试的对象,初始化值;
按照要测试的某个功能或者某个流程对 fixture 进行操作;
验证结果是否正确;
对 fixture 的及其他的资源释放等清理工作。
对 fixture 的多个测试用例,通常(1)(4)部分代码都是相似的,CppUnit 在很多地方引入了 setUp 和 tearDown 虚函数。可以在 setUp 函数里完成(1)初始化代码,而在 tearDown 函数中完成(4)代码。具体测试用例函数中只需要完成(2)(3)部分代码即可,运行时 CppUnit 会自动为每个测试用例函数运行 setUp,之后运行 tearDown,这样测试用例之间就没有交叉影响。

对 fixture 的所有测试用例可以被封装在一个 CppUnit::TestFixture 的子类(命名惯例是[ClassName]Test)中。然后定义这个fixture 的 setUp 和 tearDown 函数,为每个测试用例定义一个测试函数(命名惯例是 testXXX)。下面是个简单的例子:


class MathTest : public CppUnit::TestFixture {
protected:
int m_value1, m_value2;

public:
MathTest() {}

// 初始化函数
void setUp () {
m_value1 = 2;
m_value2 = 3;
}
// 测试加法的测试函数
void testAdd () {
// 步骤(2),对 fixture 进行操作
int result = m_value1 + m_value2;
// 步骤(3),验证结果是否争取
CPPUNIT_ASSERT( result == 5 );
}
// 没有什么清理工作没有定义 tearDown.
}



在测试函数中对执行结果的验证成功或者失败直接反应这个测试用例的成功和失败。CppUnit 提供了多种验证成功失败的方式:


CPPUNIT_ASSERT(condition) // 确信condition为真
CPPUNIT_ASSERT_MESSAGE(message, condition) // 当condition为假时失败, 并打印message
CPPUNIT_FAIL(message) // 当前测试失败, 并打印message
CPPUNIT_ASSERT_EQUAL(expected, actual) // 确信两者相等
CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual) // 失败的同时打印message
CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta) // 当expected和actual之间差大于delta时失败



要把对 fixture 的一个测试函数转变成一个测试用例,需要生成一个 CppUnit::TestCaller 对象。而最终运行整个应用程序的测试代码的时候,可能需要同时运行对一个 fixture 的多个测试函数,甚至多个 fixture 的测试用例。CppUnit 中把这种同时运行的测试案例的集合称为 TestSuite。而 TestRunner 则运行测试用例或者 TestSuite,具体管理所有测试用例的生命周期。目前提供了 3 类TestRunner,包括:


CppUnit::TextUi::TestRunner // 文本方式的TestRunner
CppUnit::QtUi::TestRunner // QT方式的TestRunner
CppUnit::MfcUi::TestRunner // MFC方式的TestRunner



下面是个文本方式 TestRunner 的例子:


CppUnit::TextUi::TestRunner runner;
CppUnit::TestSuite *suite= new CppUnit::TestSuite();

// 添加一个测试用例
suite->addTest(new CppUnit::TestCaller<MathTest> (
"testAdd", testAdd));

// 指定运行TestSuite
runner.addTest( suite );
// 开始运行, 自动显示测试进度和测试结果
runner.run( "", true ); // Run all tests and wait



对测试结果的管理、显示等功能涉及到另一类对象,主要用于内部对测试结果、进度的管理,以及进度和结果的显示。这里不做介绍。

下面我们整理一下思路,结合一个简单的例子,把上面说的思路串在一起。

3. 手动使用步骤

首先要明确测试的对象 fixture,然后根据其功能、流程,以及以前的经验,确定测试用例。这个步骤非常重要,直接关系到测试的最终效果。当然增加测试用例的过程是个阶段性的工作,开始完成代码后,先完成对功能的测试用例,保证其完成功能;然后对可能出错的部分,结合以前的经验(比如边界值测试、路径覆盖测试等)编写测试用例;最后在发现相关 bug 时,根据 bug 完成测试用例。

比如对整数加法进行测试,首先定义一个新的 TestFixture 子类,MathTest,编写测试用例的测试代码。后期需要添加新的测试用例时只需要添加新的测试函数,根据需要修改 setUp 和 tearDown 即可。如果需要对新的 fixture 进行测试,定义新的 TestFixture 子类即可。注:下面代码仅用来表示原理,不能编译。


/// MathTest.h
// A TestFixture subclass.
// Announce: use as your owner risk.
// Author : liqun (liqun@nsfocus.com)
// Data : 2003-7-5

#include "cppunit/TestFixture.h"


class MathTest : public CppUnit::TestFixture {
protected:
int m_value1, m_value2;

public:
MathTest() {}

// 初始化函数
void setUp ();
// 清理函数
void tearDown();

// 测试加法的测试函数
void testAdd ();
// 可以添加新的测试函数
};

/// MathTest.cpp
// A TestFixture subclass.
// Announce: use as your owner risk.
// Author : liqun (liqun@nsfocus.com)
// Data : 2003-7-5

#include "MathTest.h"
#include "cppunit/TestAssert.h"

void MathTest::setUp()
{
m_value1 = 2;
m_value2 = 3;
}

void MathTest::tearDown()
{

}

void MathTest::testAdd()
{
int result = m_value1 + m_value2;
CPPUNIT_ASSERT( result == 5 );
}



然后编写 main 函数,把需要测试的测试用例组织到 TestSuite 中,然后通过 TestRuner 运行。这部分代码后期添加新的测试用例时需要改动的不多。只需要把新的测试用例添加到 TestSuite 中即可。


/// main.cpp
// Main file for cppunit test.
// Announce: use as your owner risk.
// Author : liqun (liqun@nsfocus.com)
// Data : 2003-7-5
// Note : Cannot compile, only for study.
#include "MathTest.h"
#include "cppunit/ui/text/TestRunner.h"
#include "cppunit/TestCaller.h"
#include "cppunit/TestSuite.h"

int main()
{
CppUnit::TextUi::TestRunner runner;
CppUnit::TestSuite *suite= new CppUnit::TestSuite();

// 添加一个测试用例
suite->addTest(new CppUnit::TestCaller<MathTest> (
"testAdd", testAdd));

// 指定运行TestSuite
runner.addTest( suite );
// 开始运行, 自动显示测试进度和测试结果
runner.run( "", true ); // Run all tests and wait
}



4. 常用使用方式

按照上面的方式,如果要添加新的测试用例,需要把每个测试用例添加到 TestSuite 中,而且添加新的 TestFixture 需要把所有头文件添加到 main.cpp 中,比较麻烦。为此 CppUnit 提供了 CppUnit::TestSuiteBuilder,CppUnit::TestFactoryRegistry 和一堆宏,用来方便地把 TestFixture 和测试用例注册到 TestSuite 中。下面就是通常的使用方式:


/// MathTest.h
// A TestFixture subclass.
// Announce: use as your owner risk.
// Author : liqun (liqun@nsfocus.com)
// Data : 2003-7-5

#include "cppunit/extensions/HelperMacros.h"


class MathTest : public CppUnit::TestFixture {
// 声明一个TestSuite
CPPUNIT_TEST_SUITE( MathTest );
// 添加测试用例到TestSuite, 定义新的测试用例需要在这儿声明一下
CPPUNIT_TEST( testAdd );
// TestSuite声明完成
CPPUNIT_TEST_SUITE_END();
// 其余不变

protected:
int m_value1, m_value2;

public:
MathTest() {}

// 初始化函数
void setUp ();
// 清理函数
void tearDown();

// 测试加法的测试函数
void testAdd ();
// 可以添加新的测试函数
};

/// MathTest.cpp
// A TestFixture subclass.
// Announce: use as your owner risk.
// Author : liqun (liqun@nsfocus.com)
// Data : 2003-7-5

#include "MathTest.h"

// 把这个TestSuite注册到名字为"alltest"的TestSuite中, 如果没有定义会自动定义
// 也可以CPPUNIT_TEST_SUITE_REGISTRATION( MathTest );注册到全局的一个未命名的TestSuite中.
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MathTest, "alltest" );

// 下面不变

void MathTest::setUp()
{
m_value1 = 2;
m_value2 = 3;
}

void MathTest::tearDown()
{

}

void MathTest::testAdd()
{
int result = m_value1 + m_value2;
CPPUNIT_ASSERT( result == 5 );
}


/// main.cpp
// Main file for cppunit test.
// Announce: use as your owner risk.
// Compile : g++ -lcppunit MathTest.cpp main.cpp
// Run : ./a.out
// Test : RedHat 8.0 CppUnit1.8.0
// Author : liqun ( a litthle modification. liqun@nsfocus.com)
// Data : 2003-7-5

// 不用再包含所有TestFixture子类的头文件
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>

// 如果不更改TestSuite, 本文件后期不需要更改.

int main()
{
CppUnit::TextUi::TestRunner runner;

// 从注册的TestSuite中获取特定的TestSuite, 没有参数获取未命名的TestSuite.
CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry("alltest");
// 添加这个TestSuite到TestRunner中
runner.addTest( registry.makeTest() );
// 运行测试
runner.run();
}



这样添加新的测试用例只需要在类定义的开始声明一下即可。

5. 其他实际问题

通常包含测试用例代码和被测试对象是在不同的项目中。应该在另一个项目(最好在不同的目录)中编写 TestFixture,然后把被测试的对象包含在测试项目中。

对某个类或者某个函数进行测试的时候,这个 TestFixture 可能引用了别的类或者别的函数,为了隔离其他部分代码的影响,应该在源文件中临时定义一些桩程序,模拟这些类或者函数。这些代码可以通过宏定义在测试项目中有效,而在被测试的项目中无效。
re: 【CppUnit】快速入门 聂文龙 2008-06-18 12:33
如果以上编译安装没有出错。CPPUNIT会在系统的/usr/local/bin下安装cppunit-config文件。可以运行如下命令进行验证。

查看版本信息

$cppunit-config --version

查看编译标志

$cppunit-config --cflags

查看链接标志

$cppunit-config --libs
re: cppunit 聂文龙 2008-06-18 11:04

cppunit

CppUnit looks like an interesting test framework, but unfortunately, the cookbook example is very hard to follow. Thankfully, I found the DirtSimpleCppUnitExample which does seem to work. This is yet another example of why I prefer to program in python. I can basically see what is going on, but it is way more complicated that why I have to do in python.
#include <memory>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>


class ExampleTestCase : public CppUnit::TestCase { CPPUNIT_TEST_SUITE( ExampleTestCase ); CPPUNIT_TEST( example ); CPPUNIT_TEST( anotherExample ); CPPUNIT_TEST( testEquals ); CPPUNIT_TEST_SUITE_END(); double m_value1; double m_value2; void example (); void anotherExample (); void testEquals (); public: void setUp (); };

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ExampleTestCase, "ExampleTestCase" );

void ExampleTestCase::setUp () { m_value1 = 2.0; m_value2 = 3.0; }

void ExampleTestCase::example () { CPPUNIT_ASSERT (1 == 1); }

void ExampleTestCase::anotherExample () { CPPUNIT_ASSERT (2 == 2); }

void ExampleTestCase::testEquals () { std::auto_ptr<long> l1 (new long (12)); std::auto_ptr<long> l2 (new long (12));

CPPUNIT_ASSERT_DOUBLES_EQUAL (m_value1, 2.0, 0.01); CPPUNIT_ASSERT_DOUBLES_EQUAL (m_value2, 3.0, 0.01); CPPUNIT_ASSERT_EQUAL (12, 12); CPPUNIT_ASSERT_EQUAL (12L, 12L); CPPUNIT_ASSERT_EQUAL (*l1, *l2);

CPPUNIT_ASSERT(12L == 12L); CPPUNIT_ASSERT_DOUBLES_EQUAL (12.0, 11.99, 0.5); }

CppUnit::Test *suite() { CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry();

registry.registerFactory( &CppUnit::TestFactoryRegistry::getRegistry( "ExampleTestCase" ) ); return registry.makeTest(); }



int main( int argc, char* argv[] ) { // if command line contains "-selftest" then this is the post build check // => the output must be in the compiler error format. bool selfTest = (argc > 1) && (std::string("-selftest") == argv[1]);



CppUnit::TextUi::TestRunner runner; runner.addTest( suite() ); // Add the top suite to the test runner

if ( selfTest ) { // Change the default outputter to a compiler error format outputter // The test runner owns the new outputter. runner.setOutputter( CppUnit::CompilerOutputter::defaultOutputter( &runner.result(), std::cerr ) ); }

// Run the test. bool wasSucessful = runner.run( "" );

// Return error code 1 if any tests failed. return wasSucessful ? 0 : 1; }
The GNU makefile to go with it for mac osx with fink 10.4-transitional. The c++ compiler must match what was used to build CppUnit, so if you are using the 10.4 fink tree, chage g++-3.3 to just g++.
CXX:=g++-3.3
CXXFLAGS:=-I/sw/include
LDFLAGS:=-lcppunit -L/sw/lib


dirtsimple:
Then build and run it:
$ make
g++-3.3 -I/sw/include   -lcppunit -L/sw/lib  dirtsimple.C   -o dirtsimple


$ ./dirtsimple ...

OK (3 tests)

re: cppunit 聂文龙 2008-06-18 10:40

一、系统环境: 二、Red Hat Enterprise Linux4.0下CppUnit1.12.0的安装 三、实例

一、系统环境:
Red Hat Enterprise Linux4.0
 Kernel:2.6.9-5 EL
二、Red Hat Enterprise Linux4.0下CppUnit1.12.0的安装
取得:

http://sourceforge.net/projects/cppunit/ 最新的稳定版本为1.12.0。下载:cppunit-1.12.0.tar.gz。
解压缩:
tar -xzf cppunit-1.12.0.tar.gz

生成make file:
./configure

安装:
make
make install

配置共享库:
vi ld.so.conf
添加:/usr/local/lib
保存
可以使用
ldconfig -v | grep cppunit
命令查看是否配置成功。

三、实例

#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TestRunner.h>

#include "ldap_util.h"
#include "sequence_operator.h"

//test COther_Operator
class COther_TestCase : public CPPUNIT_NS::TestFixture
{
    CPPUNIT_TEST_SUITE( COther_TestCase );
        CPPUNIT_TEST( CSequence_Operator_testGetNextSeq );
        CPPUNIT_TEST( testBackupRestore );
    CPPUNIT_TEST_SUITE_END();

protected:
    LDAP *ld;
    CSequence_Operator *base;

public:
    void setUp()
    {
        CLDAP_Util::GetConnection(&ld);
        base = new CSequence_Operator();
    }
    void tearDown()
    {
        CLDAP_Util::CloseConnection(&ld);
        delete base;
    }

protected:
    void CSequence_Operator_testGetNextSeq()
    {
        int seq,nextseq;
        CPPUNIT_ASSERT_NO_THROW(seq = base->GetNextSeq(ld,1));
        CPPUNIT_ASSERT_NO_THROW(nextseq = base->GetNextSeq(ld,1));
        CPPUNIT_ASSERT_EQUAL(seq+1,nextseq);
    }
    void testBackupRestore()
    {
        CDiscoveryDomain_Operator dd_operator;
        CDiscoveryDomainSet_Operator dds_operator;
        vector<ISNS_ATTR> keyAttr_dd;
        vector<ISNS_ATTR> addAttr_dd;
        vector<ISNS_ATTR> keyAttr_dds;
        vector<ISNS_ATTR> addAttr_dds;
       
        ISNS_ATTR temp;
       
        temp.tag = 2065;
        temp.len = 1;
        temp.val.dd_id = 0;
        keyAttr_dd.push_back(temp);
        addAttr_dd.push_back(temp);
       
        temp.tag = 2066;
        temp.len = 16;
        strcpy(temp.val.dd_sym_name,"DD Symbolic Name");
        addAttr_dd.push_back(temp);
       
        temp.tag = 2049;
        temp.len = 1;
        temp.val.dd_id = 0;
        keyAttr_dds.push_back(temp);
        addAttr_dds.push_back(temp);
       
        temp.tag = 2050;
        temp.len = 1;
        strcpy(temp.val.dds_sym_name,"DDS Name");
        addAttr_dds.push_back(temp);

        //insert dd
        CPPUNIT_ASSERT_NO_THROW(dd_operator.Insert(ld,keyAttr_dd,addAttr_dd));

        //backup db
        CPPUNIT_ASSERT_EQUAL(CLDAP_Util::Backup(),LDAP_SUCCESS);
       
        //remove dd
        CPPUNIT_ASSERT_NO_THROW(dd_operator.Remove(ld,keyAttr_dd));
        //insert dds
        CPPUNIT_ASSERT_NO_THROW(dds_operator.Insert(ld,keyAttr_dds,addAttr_dds));
       
        //restore db
        CPPUNIT_ASSERT_EQUAL(CLDAP_Util::Restore(),LDAP_SUCCESS);
       
        //check dd exist
        vector<ISNS_ATTR> rstAttr;
        CPPUNIT_ASSERT_NO_THROW(rstAttr = dd_operator.Search(ld,keyAttr_dd,keyAttr_dd));
        int size = rstAttr.size();
        CPPUNIT_ASSERT_EQUAL(size,1);
        //remove dd
        CPPUNIT_ASSERT_NO_THROW(dd_operator.Remove(ld,keyAttr_dd));
        //check dds exist
        CPPUNIT_ASSERT_NO_THROW(rstAttr = dds_operator.Search(ld,keyAttr_dds,addAttr_dds));
        size = rstAttr.size();
        CPPUNIT_ASSERT_EQUAL(size,0);
    }
};

//注册测试用例,很重要,只有在这里注册了才会运行测试方法
CPPUNIT_TEST_SUITE_REGISTRATION( COther_TestCase );

//main方法中的东西都不需要改动,直接copy就可以了。

int main( int argc, char* argv[] )
{  
    // Create the event manager and test controller
    CPPUNIT_NS::TestResult controller;

    // Add a listener that colllects test result
    CPPUNIT_NS::TestResultCollector result;
    controller.addListener( &result );               

    // Add a listener that print dots as test run.
    CPPUNIT_NS::BriefTestProgressListener progress;
    controller.addListener( &progress );           

    // Add the top suite to the test runner
    CPPUNIT_NS::TestRunner runner;
    runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
    runner.run( controller );

    // Print test in a compiler compatible format.
    CPPUNIT_NS::CompilerOutputter outputter( &result, CPPUNIT_NS::stdCOut() );
    outputter.write();

    return result.wasSuccessful() ? 0 : 1;
}

四、编译
g++ -ggdb testcase.cpp -o testcase.o
g++ -lstdc++ -lcppunit -f -0 testcase.o ....
re: 环境变量 聂文龙 2008-06-17 03:22
定义头文件的搜索路径
export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH


定义库文件的搜索路径,包括静态库和动态库
export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH


定义动态库运行时的加载路径
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH


b、在/etc/profile文件中设置环境变量:

PATH=$PATH:/usr/local/bin

CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH: /usr/local/include

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib

MANPATH=$MANPATH:/usr/local/man


export PATH CPLUS_INCLUDE_PATH LD_LIBRARY_PATH LIBRARY_PATH MANPATH


re: 安装 GCC-2.95.3 聂文龙 2008-06-16 16:12
公司要装一台存储服务器,我认为Linux+Samba是最理想的解决方案。因为应用非常简单,于是我便用Linux安装盘一路默认装安了系统。Samba服务是系统默认安装的,很简单就配置成功了(这里建议新手在窗口下配置)。本来这样就完工了,但了为了防止Samba服务不幸阵亡,特做出第二手准备,安装ftp服务,以保万全。此时问题出现了,在我安装从网上下载的Vsftp的Tar包时,出现编译无法安成的错误,提示缺少GCC编译器。虽说我偷懒默认安装的系统,你少个库文件也罢,可缺少gcc,感觉就有点是RH的不对了。于是偶本着有问题就要解决的原则,开始安装Gcc。不装不知道,一装吓一跳,这次可真正领教了Linux系统包依赖啦。具体尝试安装过程在此省略五位数的汉字(。。!)。终于被我发现了,gcc所需文件的安装顺序。说到这里道声抱谦,忘记告诉大家gcc编译器的安装所需文件分别是:glibc-kernheaders glibc-headers glibc-devel cpp gcc 五个文件,匀可在RH AS4的安装盘内找到(不建议网上下载,会有版本不兼容问题)。好啦,按照我所列文件的顺序去rpm吧,对于RH的系统,象此类编译器的安装或是库文件的安装,还是Rpm来的简单。至于我碰上Gcc问题为什么不用rpm装ftp服务,呵呵!
re: 环境变量 聂文龙 2008-06-16 10:59
[root@localhost home]# cp ~/.bash_history /home/haha.txt
[root@localhost home]#
re: 环境变量 聂文龙 2008-06-16 10:40
vi ~/.bash_history
可以查看到
re: 环境变量 聂文龙 2008-06-16 02:20
s
re: 环境变量 聂文龙 2008-06-16 02:09
请教一下怎么保存更改过的.bash_profile文件?

在终端里用 VI进入编辑以后按ESC在按冒号":"之后输入wq
% ../gcc-2.95.3/configure --prefix=/usr/local/gcc-2.95.3 --enable-threads=posix --disable-checking --enable--long-long --host=i686-redhat-linux --with-system-zlib --enable-languages=c,c++,java
re: GCC命令 聂文龙 2008-06-15 02:16
Gcc简介

Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。

gcc 编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。 在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。



.c为后缀的文件: C语言源代码文件;

.a为后缀的文件: 是由目标文件构成的档案库文件;

.C,.cc或.cxx 为后缀的文件: 是C++源代码文件;

.h为后缀的文件: 是程序所包含的头文件;

.i 为后缀的文件: 是已经预处理过的C源代码文件;

.ii为后缀的文件: 是已经预处理过的C++源代码文件;

.m为后缀的文件: 是Objective-C源代码文件;

.o为后缀的文件: 是编译后的目标文件;

.s为后缀的文件: 是汇编语言源代码文件;

.S为后缀的文件: 是经过预编译的汇编语言源代码文件。



gcc的执行过程

虽然我们称gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称 预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。

命令 gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调 用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言 源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最 后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中 连到合适的地方。

gcc的基本用法和选项

在使用gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。

gcc最基本的用法是∶gcc [options] [filenames]

其中options就是编译器所需要的参数,filenames给出相关的文件名称。其中[options]的值可以为下列值:

-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。

-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。

-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶

A)#include

B)#include “myinc.h”

其 中,A类使用尖括号(< >),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而对于B类,cpp在当前目录中搜寻头文件, 这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分 别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。

-Ldirname,将dirname所指出的目录加入到程序函数档案 库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项 告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。

-lname,在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。

上面我们简要介绍了gcc编译器最常用的功能和主要参数选项,更为详尽的资料可以参看Linux系统的联机帮助。



为了更加详细的说明GCC参数极其相关的使用方法,我们再换一种方式来说明,以下为自问自答的十个问题:

1、gcc包含的c/c++编译器

gcc、cc、c++、g++;gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译

2、gcc的基本用法

gcc test.c这样将编译出一个名为a.out的程序,gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字。

3、为什么会出现undefined reference to 'xxxxx'错误?

首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序 要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm

4、-l参数和-L参数

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。

好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到 /usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与 libtest.so配套的头文件)。

放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在 /usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是- L/aaa/bbb/ccc –ltest。

另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx
库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了

ln -s libxxxx-x.x.x.so libxxxx.so

手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic

-lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了--libs参数外还有一个参数是--cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config --libs --cflags,看看输出结果。

现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个`xxxx-config --libs --cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config --libs --cflags`这样
就差不多了。注意`不是单引号,而是1键左边那个键。

除了xxx-config以外,现在新的开发包一般都用pkg-config来生成链接参数,使用方法跟xxx-config类似,但xxx-config是针对特定的开发包,但pkg-config包含很多开发包的链接参数的生成,用pkg-config --list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg -config pagName --libs --cflags,其中pagName是包名,是pkg-config--list-all里列出名单中的一个,比如gtk1.2的名字就是gtk+, pkg-config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一样的。比如:

gcc gtktest.c `pkg-config gtk+ --libs --cflags`

5、-include和-I参数

-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上- I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的--cflags参数就是用来生成-I 参数的

6、-O参数

这是一个程序优化参数,一般用-O2就是,用来优化程序用的,比如gcc test.c -O2,优化得到的程序比没优化的要小,执行速度可能也有所提高

7、-shared参数

编译动态库时要用到,比如gcc -shared test.c -o libtest.so

8、几个相关的环境变量

PKG_CONFIG_PATH:用来指定pkg-config用到的pc文件的路径,默认是/usr/lib/pkgconfig,pc文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs参数和Cflags参数等等。

CC:用来指定c编译器

CXX:用来指定cxx编译器

LIBS:跟上面的--libs作用差不多

CFLAGS:跟上面的--cflags作用差不多

CC,CXX,LIBS,CFLAGS手动编译时一般用不上,在做configure时有时用到,一般情况下不用管。

环境变量设定方法:export ENV_NAME=xxxxxxxxxxxxxxxxx

9、关于交叉编译

交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上,比如在我们地PC平台(X86 CPU)上编译出能运行在sparc CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到sparc CPU平台上才能运行。当然两个平台用的都是linux,这种方法在异平台移植和嵌入式开发时用得非常普遍。相对与交叉编译,我们平常做的编译就叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。用来编译这种程序的编译器就叫交叉编译器,相对来说,用来做本地编译的就叫本地编译器,一般用的都是gcc,但这种gcc跟本地的gcc编译器是不一样的,需要在编译gcc时用特定的configure参数才能得到支持交叉编译的gcc。为了不跟本地编译器混淆,交叉编译器的名字一般都有前缀,比如sparc-xxxx-linux-gnu-gcc,sparc-xxxx-linux-gnu-g++ 等等。

10、交叉编译器的使用方法

使用方法跟本地的gcc差不多,但有一点特殊的是:必须用-L和-I参数指定编译器用spar c系统的库和头文件,不能用本地(X86)的库(头文件有时可以用本地的)

例子:

sparc-xxxx-linux-gnu-gcc test.c -L/path/to/sparcLib

-I/path/to/sparcInclude



gcc的错误类型及对策



gcc 编译器如果发现源程序中有错误,就无法继续进行,也无法生成最终的可执行文件。为了便于修改,gcc给出错误资讯,我们必须对这些错误资讯逐个进行分析、 处理,并修改相应的语言,才能保证源代码的正确编译连接。gcc给出的错误资讯一般可以分为四大类,下面我们分别讨论其产生的原因和对策。

第一类∶C语法错误

错误资讯∶文件source.c中第n行有语法错误(syntex errror)。这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检 查。有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,我们最主要的是要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教 材。

第二类∶头文件错误

错误资讯∶找不到头文件head.h(Can not find include file head.h)。这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。

第三类∶档案库错误

错误资讯∶连接程序找不到所需的函数库,例如∶

ld: -lm: No such file or directory

这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。

第四类∶未定义符号

错 误资讯∶有未定义的符号(Undefined symbol)。这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没 有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过 程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定 之后,修改gcc连接选项中的-l和-L项。

排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说 只是开了个头。这个过程中的错误,只是我们在使用C语言描述一个算法中所产生的错误,是比较容易排除的。我们写一个程序,到编译、连接通过为止,应该说刚 刚开始,程序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。一个程序,稍为复杂 的程序,往往要经过多次的编译、连接和测试、修改。下面我们学习的程序维护、调试工具和版本维护就是在程序调试、测试过程中使用的,用来解决调测阶段所出 现的问题。



re: linux下的tuxedo开发实例 聂文龙 2008-06-13 03:18
#./runConfigure -plinux -cgcc -xg++ -minmem -nsocket -tnative -rpthread -s
 
#gamke
re: linux下的tuxedo开发实例 聂文龙 2008-06-13 03:17
runConfigure: Helper script to run "configure" for one of the
supported platforms
Usage: runConfigure "options"
where options may be any of the following:
-p <platform> (accepts 'aix', 'beos', 'linux', 'freebsd',
'netbsd', 'solaris', 'hp-10', 'hp-11', 'openserver', 'unixware',
'os400', 'os390', 'irix', 'ptx', 'tru64', 'macosx', 'cygwin',
'qnx', 'interix', 'mingw-msys')
[required; no default]
-c <C compiler name> (e.g. gcc, cc, xlc_r, qcc, icc, icpc or ecc)
[default is make default; cc for gnu make]
-x <C++ compiler name> (e.g. g++, CC, aCC, xlC_r, xlC_rv5compat, QCC,
icc, icpc or ecc) [default is make default; g++ for gnu make]
-d (specifies that you want to build debug version)
[default: no debug]
-m <message loader> can be 'inmem', 'icu', 'MsgFile' or
'iconv' [default: inmem]
-n <net accessor> can be 'fileonly', 'libwww', 'socket', 'winsock' or
'native' [default: socket]
-t <transcoder> can be 'icu', 'Iconv400', 'Uniconv390', 'Win32',
'IconvFBSD', 'IconvGNU' or 'native'
[default: native]
-r <thread option> can be 'pthread' or 'dce'
(AIX, HP-11, and Solaris) or 'sproc' (IRIX) or 'none'
[default: pthread]
-s (specifies that you want to build static libraries) [default: shared]
-b <bitsToBuild> (accepts '64', '32') [default: 32]
-l <extra linker options>
-z <extra compiler options>
-P <install-prefix>
-C <any one extra configure options>
-h (get help on the above commands)
[root@localhost bin]#
[root@localhost bin]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.0.18-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.10 sec)

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from user;
+-----------------------+------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
| Host | User | Password | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections |
+-----------------------+------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
| localhost | root | 565491d704013245 | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | | | | | 0 | 0 | 0 |
| localhost.localdomain | root | | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | | | | | 0 | 0 | 0 |
| localhost | | | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 |
| localhost.localdomain | | | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 |
+-----------------------+------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
4 rows in set (0.07 sec)

mysql> update user set host ='%' where user ='root' and host ='localhost';
Query OK, 1 row affected (0.09 sec)
Rows matched: 1 Changed: 1 Warnings: 0

#好像并不能远程登陆
mysql> select * from user;
+-----------------------+------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
| Host | User | Password | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections |
+-----------------------+------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
| % | root | 565491d704013245 | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | | | | | 0 | 0 | 0 |
| localhost.localdomain | root | | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | | | | | 0 | 0 | 0 |
| localhost | | | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 |
| localhost.localdomain | | | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 |
+-----------------------+------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
4 rows in set (0.01 sec)

mysql> select * from user;
+-----------------------+------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
| Host | User | Password | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections |
+-----------------------+------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
| % | root | 565491d704013245 | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | | | | | 0 | 0 | 0 |
| localhost.localdomain | root | | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | | | | | 0 | 0 | 0 |
| localhost | | | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 |
| localhost.localdomain | | | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 |
+-----------------------+------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
4 rows in set (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.102' IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected (0.10 sec)
 
#OK


mysql>

[root@localhost mysql]# ln -s /var/lib/mysql/mysql.sock /tmp/
ln: 正在创建指向“/var/lib/mysql/mysql.sock”的符号链接“/tmp/mysql.sock”: 文件已存在
[root@localhost mysql]# netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:817 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN
tcp 0 0 :::22 :::* LISTEN

[root@localhost mysql]# ls
bin data INSTALL-BINARY mysql-test share tests
configure docs lib README sql-bench
COPYING include man scripts support-files

[root@localhost mysql]# cd bin

[root@localhost bin]# mysqladmin -u root password 123456
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists!

[root@localhost bin]# mysqladmin -u root -S /var/lib/mysql/mysql.soc password 123456
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.soc' (2)'
Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.soc' exists!

[root@localhost bin]# mysqladmin -u root -S /var/lib/mysql/mysql.sock password '123456'
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists!

[root@localhost bin]# mysqladmin -u root password '123456'
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists!

[root@localhost bin]# mysqladmin -u root -S /tmp/mysql.sock password 123456
 
[root@localhost bin]# mysql -u root -p
Enter password:
ERROR 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

[root@localhost bin]# ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
ln: 正在创建指向“/var/lib/mysql/mysql.sock”的符号链接“/tmp/mysql.sock”: 文件已存在

[root@localhost bin]# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
[root@localhost bin]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 4.0.18-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> exit
Bye
[root@localhost bin]#

linux下非root用户可以安装mysql吗?我做了如下尝试:

在本论坛的FAQ上看到这么一段:
[i]Q: 如何自己编译mysql
A:
CODE:[Copy to clipboard]以redhat linux 9.0为例:
下载文件 mysql-4.1.13.tar.gz
#tar zxf mysql-4.1.13.tar.gz
#cd mysql-4.1.13
#./configure --prefix=/usr/local/mysql --enable-assembler \
--with-mysqld-ldflags=-all-static --localstatedir=/usr/local/mysql/data \
--with-unix-socket-path=/tmp/mysql.sock --enable-assembler \
--with-charset=complex --with-low-memory --with-mit-threads
#make
#make install
#groupadd mysql
#useradd -g mysql mysql
#chgrp -R mysql /usr/local/mysql/
#/usr/local/mysql/bin/mysqld_safe --user=mysql &[/i]

我是这样做的,下载文件:mysql-standard-5.0.19-linux-i686.tar.gz
解压到 /home/mine/mysql下
$cd /home/mine/mysql
$./configure --prefix=/home/mine/mysql --enable-assembler \
--with-mysqld-ldflags=-all-static --localstatedir=/home/mine/mysql/data \
--with-unix-socket-path=/tmp/mysql.sock --enable-assembler \
--with-charset=complex --with-low-memory --with-mit-threads

执行完这句终端就挂住了,等了十多分钟没跳出来,最后只好强行终止.

但是根本执行不了make提示No target...之类错误,当然下面的命令也都没执行成功.

现在有几个问题: 安装mysql必须在root用户下吗???
可不可以不往/usr/local下写东西(因为没有root密码,普通用户没有权限)

我的mysql-standard-5.0.19-linux-i686.tar.gz包解压后包括以下目录和文件:
目录:bin
data
docs
include
lib
man
mysgl-test
scripts
share
sql-bench
support-files
tests
文件:configure
COPYING
EXCEPTIONS-CLIENT
INSTALL-BINARY

我该怎么办呢???请各位帮帮忙,先谢谢各位啦!!!

安装的时候一定要用root用户或者root权限

-->

你下载的如果是可直接使用的二进制包,可以直接启动,而无需运行 configure 自己编译
另外to楼上的,mysql可以用非root运行,自己没确实尝试过的,不要这么坚决的误导别人



-->


非root怎么创建mysql用户和mysql组?

-->

用普通用户的身份就能运行mysqld了

建mysql用户肯定要用root操作权限的,安装的时候可以用其它用户安装的,启动的时候也是可以用其它用户启动的

-->

不是必须要建 mysql 用户和组的。

-->

版主说的对。
我刚才试了一下,果然从下载到启动,都是使用只有普通权限的用户账号。唯一的限制是不能把mysql目录放到 /usr/local/ 下去,我只是放在该账号自己的目录中。
注:我没有使用要编译的版本,用的是可直接使用的二进制包。
不过为了管理上的方便和清晰性,还是建立一个专用用户比较好。

我一般用nobody这个用户来作为mysql的属主

到是真的饿没试验过

先谢谢各位的 帮助 ,但是我的问题还没解决,我 在命令行里运行mysql提示如下错误:

ERROR 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

我在google上搜索这个错误,提示好象是服务未启动,我又运行./mysql.server start 又出如下错误

Starting MySQLCouldn't find MySQL manager or server [失败]

附:to 8楼的 大哥,方便的话告诉我您下载mysql完整的版本号,我看看是不是我 的版本的问题,

如果您还有时间的话麻烦您给我简短写个教程,就是先运行什么,再运行什么,只要数据库能正常工作就行,我们以前都用oracle数据库,现在刚接触mysql,不是很熟练,

再次感谢各位的帮忙!!!!

我又在本论坛的FAQ里看到如下方法:
**********************************************************************************
Q: 如何安装已经编译好了的mysql二进制包
A:
CODE:
[Copy to clipboard]
首先下载合适的二进制包,例如下载了文件 mysql-standard-4.1.13-pc-linux-gnu-i686.tar.gz
#groupadd mysql
#useradd -g mysql mysql
#cd /usr/local
#tar zxf mysql-standard-4.1.13-pc-linux-gnu-i686.tar.gz
#ln -s mysql-standard-4.1.13-pc-linux-gnu-i686 mysql
#cd mysql
#scripts/mysql_install_db --user=mysql
#chgrp -R mysql *
#bin/mysqld_safe --user=mysql &
有什么个性化的配置,可以通过创建 /etc/my.cnf 或者 /usr/local/mysql/data/my.cnf,增加相关的参数来实现。
*************************************************************************************

自己执行了一下mysql_install_db,出现如下错误:

mkdir: 无法创建目录‘/var/lib/mysql/mysql’: 权限不够
chmod: 无法取得 ‘/var/lib/mysql/mysql’ 的属性: 没有那个文件或目录
mkdir: 无法创建目录‘/var/lib/mysql/test’: 权限不够
chmod: 无法取得 ‘/var/lib/mysql/test’ 的属性: 没有那个文件或目录
Preparing db table
Preparing host table
Preparing user table
Preparing func table
Preparing tables_priv table
Preparing columns_priv table
Installing all prepared tables
ERROR: 1049 Unknown database 'mysql'
060331 23:21:07 Aborting

060331 23:21:07 /usr/libexec/mysqld: Shutdown Complete

Installation of grant tables failed!

Examine the logs in /var/lib/mysql for more information.
You can also try to start the mysqld daemon with:
/usr/libexec/mysqld --skip-grant &
You can use the command line tool
/usr/bin/mysql to connect to the mysql
database and look at the grant tables:

shell> /usr/bin/mysql -u root mysql
mysql> show tables

Try 'mysqld --help' if you have problems with paths. Using --log
gives you a log in /var/lib/mysql that may be helpful.

The latest information about MySQL is available on the web at
http://www.mysql.com">http://www.mysql.com
Please consult the MySQL manual section: 'Problems running mysql_install_db',
and the manual section that describes problems on your OS.
Another information source is the MySQL email archive.
Please check all of the above before mailing us!
And if you do mail us, you MUST use the /usr/bin/mysqlbug script!


感觉还是得给/var/lib/mysql里写东西,我可不可以把这个默认路径改调啊,如何修改,还请各位再给出出主意,
谢谢!!!!

注:以下都是在普通账号权限下执行,假设账号是 rardge,组也是 rardge。
1. 用 cd 指令切换到你自己的用户目录;
2. 下载合适的二进制包,例如下载了文件 mysql-standard-4.1.13-pc-linux-gnu-i686.tar.gz <-- 这个自己去下载,我是freebsd系统,我下的是最新的5.x的,你是linux,我不知道你该用哪个。但原理应该一样。
3. tar xzvf 刚才下的包
4. mv 解压后的目录名 mysql <-- 改名字只是为了输入起来方便,不用输入一长串东西。
5. 设置访问权限,重要!
chown -R rardge:rardge mysql <-- 让 rardge 对 mysql 目录可读写
chmod -R o= mysql <-- 除了 rardge 和 root 外,无人能访问 mysql 目录(这个是在上面假设的前提下,注意你的用户组,如果组里面有其他成员,你还要再 chmod -R g= mysql)
ls -ld mysql 看看权限 rwxr-x--- 或者 rwx------
6. cd mysql
7. ./scripts/mysql_install_db --user=rardge <-- 如果你当前登录账号和后面这个参数中指定的一样的,也可以不加那个参数,关键是用一个可以对 mysql 目录有 写 权限的账号!
8. 启动
./bin/mysqld_safe --user=rardge &

如果没错的话,再设置 MySQL 的 root 口令,就 Ok 了!
另,我的系统和你的不一样,所以有些差异你自己掌握。

至于你说的'/var/lib/mysql/mysql',这个在 mysql_install_db 中可以修改。
你搜索一下 ldata,它可能是 ldata=/var/lib/mysql 这样,你改成 ldata=./data,意思是数据库放在你 mysql 目录下的 data 目录,这个你肯定有写权限了。



再次感谢rardge的答复,但是问题还是没有解决,我打开mysql_install_db,内容如下:

1:#!/bin/sh
2:# Copyright (C) 2002-2003 MySQL AB
3:# For a more info consult the file COPYRIGHT distributed with this file.
4:
5:# This scripts creates the privilege tables db, host, user, tables_priv,
6:# columns_priv, procs_priv in the mysql database, as well as the func table.
7:#
8:# All unrecognized arguments to this script are passed to mysqld.
9:
10:in_rpm=0
11:windows=0
12:defaults=""
13:user=""
14:
15:case "$1" in
16: --no-defaults|--defaults-file=*|--defaults-extra-file=*)
17: defaults="$1"; shift
18: ;;
19:esac
20:
21:parse_arguments() {
22: # We only need to pass arguments through to the server if we don't
23: # handle them here. So, we collect unrecognized options (passed on
24: # the command line) into the args variable.
25: pick_args=
26: if test "$1" = PICK-ARGS-FROM-ARGV
27: then
28: pick_args=1
29: shift
30: fi
31:
32: for arg do
33: case "$arg" in
34: --force) force=1 ;;
35: --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
36: --ldata=*|--datadir=*) ldata=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
37: --user=*)
38: # Note that the user will be passed to mysqld so that it runs
39: # as 'user' (crucial e.g. if log-bin=/some_other_path/
40: # where a chown of datadir won't help)
41: user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
42: --skip-name-resolve) ip_only=1 ;;
43: --verbose) verbose=1 ;;
44: --rpm) in_rpm=1 ;;
45: --windows) windows=1 ;;
46: *)
47: if test -n "$pick_args"
48: then
49: # This sed command makes sure that any special chars are quoted,
50: # so the arg gets passed exactly to the server.
51: args="$args "`echo "$arg" | sed -e 's,\([^a-zA-Z0-9_.-]\),\\\\\1,g'`
52: fi
53: ;;
54: esac
55: done
56:}
57:
58:# Get first arguments from the my.cfg file, groups [mysqld] and
59:# [mysql_install_db], and then merge with the command line arguments
60:if test -x ./bin/my_print_defaults
61:then
62: print_defaults="./bin/my_print_defaults"
63:elif test -x ./extra/my_print_defaults
64:then
65: print_defaults="./extra/my_print_defaults"
66:elif test -x ./bin/my_print_defaults
67:then
68: print_defaults="./bin/my_print_defaults"
69:elif test -x ./bin/mysql_print_defaults
70:then
71: print_defaults="./bin/mysql_print_defaults"
72:else
73: print_defaults="my_print_defaults"
74:fi
75:
76:args=
77:ldata=
78:execdir=
79:bindir=
80:basedir=
81:force=0
82:verbose=0
83:fill_help_tables=""
84:
85:parse_arguments `$print_defaults $defaults mysqld mysql_install_db`
86:parse_arguments PICK-ARGS-FROM-ARGV "$@"
87:
88:test -z "$ldata" && ldata=./data
89:if test -z "$basedir"
90:then
91: basedir=.
92: bindir=./bin
93: execdir=./bin
94: pkgdatadir=./support-files
95:else
96: bindir="$basedir/bin"
97: if test -x "$basedir/libexec/mysqld"
98: then
99: execdir="$basedir/libexec"
100: elif test -x "$basedir/sbin/mysqld"
101: then
102: execdir="$basedir/sbin"
103: else
104: execdir="$basedir/bin"
105: fi
106:fi
107:
.
.
.
我将77行的ldat该为了ldata=./data,还是提示

mkdir: 无法创建目录‘/var/lib/mysql/mysql’: 权限不够
chmod: 无法取得 ‘/var/lib/mysql/mysql’ 的属性: 没有那个文件或目录
mkdir: 无法创建目录‘/var/lib/mysql/test’: 权限不够
chmod: 无法取得 ‘/var/lib/mysql/test’ 的属性: 没有那个文件或目录

等错误,后来有查了写资料,好象/etc/my.cnf下有一些mysql的路径设置,我看了一下,就是上面的这些路径,
会不会是mysql_install_db中某个选项设置默认从/etc/my.cnf下找路径啊,如果是的话,如何修改啊,

再次感谢!!!

哦,你的 mysql_install_db 原来和我的一样啊,我以为linux下的版本有什么不同的呢,呵呵
这样的话,这个脚本你不用做修改的,第88行就是这么做的。
你看看有没有 /etc/my.cnf 这个文件,如果是按照我的那种方法新装的话,不会存在这个文件,这个文件是安装的时候手工拷贝过去的。而且,你没有root权限,似乎也无法拷贝到 /etc/ 下。
如果有这个文件,而你有root权限的话,一,你可以修改里面的路径配置;二,干脆删除(不放心的话就改个名字),然后看 mysql/support-files/my-*.cnf,看开头的文字说明,决定你要把my.cnf放在哪里。
自己试一下吧,我只能提供参考。

好的,我再试试,非常感谢您的帮忙!!!

不过如果搞不定的话还得向您请教!!!

哎,还是 搞不定啊,把/etc/my.cnf删除后(我是在自己的机器上做实验的,所以自己有root的密码,所以可以把它删掉,但是我真正想装的那台机器 root密码在管理员手中)

后来又查看support-files下的my-medium.cnf

# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /usr/local/mysql/data) or
# ~/.my.cnf to set user-specific options.

我把 my-medium.cnf拷贝到~/.my.cnf后,再运行./scripts/mysql_install_db

出现如下错误:

Installing all prepared tables
Fill help tables

To start mysqld at boot time you have to copy support-files/mysql.server
to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
./bin/mysqladmin -u root password 'new-password'
./bin/mysqladmin -u root -h localhost.localdomain password 'new-password'
See the manual for more instructions.

You can start the MySQL daemon with:
cd . ; ./bin/mysqld_safe &

You can test the MySQL daemon with the benchmarks in the 'sql-bench' directory:
cd sql-bench ; perl run-all-tests

Please report any problems with the ./bin/mysqlbug script!

The latest information about MySQL is available on the web at
http://www.mysql.com">http://www.mysql.com
Support MySQL by buying support/licenses at https://order.mysql.com

我在网上搜 "To start mysqld at boot time you have to copy support-files/mysql.server
to the right place for your system "这个错误

好像说是mysql.server没启动,于是运行 ./support-files/mysql.server

但是又出如下错误:


Starting MySQL................................... [失败]

唉,还是搞不定啊,大哥再帮一下吧,感激不尽.......

呵呵,还不行啊。
你写的:“出现如下错误:”一直到“我在网上搜 ”中间的那段,其实不是错误信息,是安装完mysql后,它给你的提示,告诉你如何启动,如何修改密码等信息。
我是习惯用 ./bin/mysqld_safe & 这个启动。
另外,它启动失败,你就去 mysql/data 下看错误日志,就是 err 后缀名的那个,看它里面写什么原因。
最后有一点,你说你要装的那台机器没有root权限,但是那台机器上有 /etc/my.cnf,那代表已经安装了 MySQL,那你再安装一份的话,要参考"如何安装多个 MySQL 服务"了,要用不同的端口等等。比较麻烦了。你还不如和管理员商量一下,说说你的要求了。

再次感谢 rardge大哥 ,数据库服务终于启动了,也可以使用了,但是有一个小问题,关于密码设置的

我启动服务后,运行mysql -uroot -p然后回车,提示我输入密码,因为初始密码为空,我就直接回车了,然后
出现了mysql>
我输入show databases;回车
显示出三个数据库表
information_schema
mysql
test
然后我输入create database wyp;回车
再运行show databases;回车
显示出四个数据库表
information_schema
mysql
test
wyp
后来我输入use mysql;回车
选择了一个数据库,
然后输入update user set password="mysql" where user='root';回车(这句应该是给root设置密码的吧)
提示我修改成功,后来输入exit退出mysql;
之后再输入mysql -uroot -p回车
输入新设置的密码mysql
出错:ERROR 1045 (28000): Access denied for user 'root'@'localhost'

然后用空密码进 却可以进入数据库,但是只显示两个数据库表:
information_schema
test
另外两个不见了,也运行不了create database, 只能用显示出来的两个数据库,这是为什么,

还麻烦您给出个主意,或者说怎么能把密码删掉,恢复到原来密码为空状态.

谢谢!!!!

你该好好看看置顶的 FAQ 帖子,忘记密码怎么办、如何修改用户密码,里面都有。
你的问题是:改密码的时候没有用 password() 函数;改好密码后没有 flush privileges 刷新。
其实网上大家问的最多的都是整个问题,说什么链接不到mysqld.sock,其实大家不妨看看mysql的错误日志就明白怎么回事,我这里的错误日志是在

/var/lib/mysql/*.err 你会发现mysql只所以不能启动,是因为/var/lib/mysql的权限不允许mysql服务访问,英文mysql默认是调用mysql用户来启动服务的,好了,既然知道是什么原因找到不能启动,那就简单了。我们只要

chown -R mysql:mysql /var/lib/mysql 就行,如果还是启动不了,再慢慢调试权限,反正一般启动不了都是权限的问题。

如果大家还是不能启动不了的话,那就用我的比较繁琐的权限的设置,反正我每次都是这么做的,一般不会有问题,见下:

chown -R root /usr/local/mysql
chgrp -R mysql /usr/local/mysql
chown -R root /usr/local/mysql/bin
chgrp -R mysql /usr/local/mysql/bin
chgrp -R mysql /var/lib/mysql
chmod 777 /var/lib/mysql
chown -R root /var/lib/mysql/mysql
chgrp -R mysql /var/lib/mysql/mysql
chmod 777 /var/lib/mysql/mysql
chown -R root /var/lib/mysql/mysql/*
chgrp -R mysql /var/lib/mysql/mysql/*
chmod 777 /var/lib/mysql/mysql/*
chmod 777 /usr/local/mysql/lib/mysql/libmysqlclient.a

这里面,我有几个疑问:
1. 最后一个文件我没有找到,也不知是什么意思,
2. 所谓的用MySQL启动服务,指的是什么,是用MySQL登录linux,还是其他什么设置方式
Apache-2.0.49+PHP-4.3.6+Mysql-4.0.18安装配置

Mr.Wrong 2004-4-30

前言:
参考了网上很多人的经验,另外总结了一下我安装配置过程中遇到的问题,整理了这篇文章,希望对初学者能有些帮助,免得像我一样走很多弯路,浪费精力和时间。

安装前准备:
安装Redhat9.0 Server Mode 只安装Development ―Development Tools,其它包都不必装。# 如果你对系统很熟悉可以选择Development Tools中安装编译需要的包,不必采用默认安装。
所需软件包:
mysql-4.0.18.tar.gz # www.mysql.com
httpd-2.0.49.tar.gz # www.apache.org
php-4.3.6.tar.gz # www.php.net

1、 安装MYSQL
tar zvxf mysql-4.0.18.tar.gz
mv mysql-4.0.18 /usr/local/
groupadd mysql
useradd -g mysql mysql -s /sbin/nologin
chown CR mysql: root /usr/local/mysql-4.0.18
ln Cs /usr/local/mysql-4.0.18 /usr/local/mysql
/usr/local/mysql/configure
cp /usr/local/mysq/support-files/mysql.server /etc/rc.d/init.d/mysqld
ln -s /etc/rc.d/init.d/mysqld /etc/rc3.d/S96mysqld # 设置为自动启动

问题说明:有些人运行configure,会出现 Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'错误,这是因为系统以前装过MYSQL的RPM包,rm /etc/mysql/my.cnf文件,重新configure 就可以了。


2、 安装APACHE
tar zvxf httpd-2.0.49.tar.gz
cd httpd-2.0.49
./configure --prefix=/usr/local/apache2 --enable-so \
--enable-mods-shared=most --disable-charset-lite
make
make install
cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd
ln -s /etc/rc.d/init.d/httpd /etc/rc3.d/S97httpd # 设置为自动启动

注释:--enable-so开启DSO支持,--enable-mods-shared=most是指除了so以外的所有标准模块都编译成DSO模块,--disable-charset-lite多国语言支持

问题说明:
有的人启动Apache的时候系统会提示:"Could not determine the server's fully qualified domain name, using 127.0.0.1 for Serve,这个说明Apache服务器不能确定你的主机名。修改Apache的配置文件,查找ServerName关键字,去掉前面# 号设置为:ServerName localhost。


3、安装PHP (DSO)
tar zvxf php-4.3.6.tar.gz
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql \
--with-apxs2=/usr/local/apache2/bin/apxs
make
make install
cp php.ini-recommand /usr/local/php/lib/php.ini

编辑php.ini
修改如下参数变量
register_globals = On # 打开自动全局变量,允许网页之间传递变量
expose_php = Off # 不显示PHP版本号 (可以不设置,设置了安全点儿)

4、编辑httpd.conf
添加如下语句:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
修改如下参数变量:
ServerTokens Prod # 不显示OS和版本号
AddDefaultCharset gb2312 # 默认中文简体
启动一下apache
/usr/local/apache2/bin/apachectl start

5、测试
测试PHP,编辑php.php,内容如下。
phpinfo();
?>

测试MYSQL数据库连接,编辑mysql.php,内容如下。
$conn=mysql_pconnect("localhost","","");
if ($conn) echo "ok";
?>
如果网页可以正常显示,说明Apache-2.0.49+PHP-4.3.6+Mysql-4.0.18安装配置成功。
2008年05月23日 星期五 15:551. 下载软件 以rarlinux-3.7.0 for linux为例,在http://www.onlinedown.net/soft/3.htm网站上下载源程序(rarlinux- 3.7.0.tar.gz)即可。
安装
#tar zxvf rarlinux-3.7.0.tar.gz
#cd rar
#make
安装完毕。

2.安装软件 执行命令:
1、 解压: rar e test.rar /路径
2、 压缩: rar a 压缩后的文件名.rar 待压文件或目录

注意:若执行rar命令时出现如下提示: rar: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by rar) 则用rar文件中提供的 rar_static 版本(那是 static linking 版本,不会有 glibc 程式库版本不和的问题)即可,只需要执行命令:cp rar_static /usr/local/bin/rar (将原来的rar覆盖了,此命令还有一个作用就是让你在linux下的任何一个地方都可以执行rar)即可。
首先下载rarlinux-3.7.1.tar.gz
下载地址
2然后解压
# tar xvfz rarlinux-3.7.b1.tar.gz
3安装
# make install
mkdir -p /usr/local/bin
mkdir -p /usr/local/lib
cp rar unrar /usr/local/bin
cp rarfiles.lst /etc
cp default.sfx /usr/local/lib
4解压文件:

# rar x test.rar /
rar: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by rar)

5需要GLIBC_2.4。如果没有GLIBC_2.4可以

# cp ./rar/rar_static /usr/local/bin/rar

rar_static 版是 static linking 版本,不会有 glibc 程式库版本不和的问题。

再次解压:
[root@xxxx ~]# rar x test.rar /
RAR 3.71 Copyright (c) 1993-2007 Alexander Roshal 20 Sep 2007
Shareware version Type RAR -? for help

Extracting from test.rar
Extracting /test.txt OK
All OK

6打包
rar a install.rar ./install.log

好了!大功告成:)





---------------------------------------------------

一. 下载RAR for Linux


下载地址:http://www.rarlab.com

下载的文件是rarlinux-3.6.0.tar.gz,将其保存到~/downloads目录


二. 解压软件包


本人想将该文件解压到/opt目录下,但/opt目录只有超级用户才有写的权限,故转到超级用户

[songyadong@walter downloads]$ su


tar命令解压到/opt目录,结果将在/opt里生成rar目录


[root@walter downloads]# tar xzvf rarlinux-3.6.0.tar.gz --directory=/opt


三. 创建符号联接


查看/opt/rar目录,发现已经有rar和unrar两个程序,不用编译就可以直接使用了.为方便使用,在/usr/bin里创建两个符号连接,已便在终端下可以直接使用rar及unrar命令。

[root@walter downloads]# ln -s /opt/rar/rar /usr/bin/rar

[root@walter downloads]# ln -s /opt/rar/unrar /usr/bin/unrar


注意上面两个命令也必须在超级用户下才行.操作完成之后退出超级用户。

****************************************************************

如果不使用上面的联结符号可以把rar命令添加到环境变量也可以

步骤如下:

>PATH=$PATH:/opt/rar

>export PATH

注意:添加PATH时必需PATH=$PATH后面添加否则会破坏系统的环境变量。
tar 文档归档、压缩、解压命令。
命令格式:#tar [[主选项+辅选项]]
常用选项:
主选项:

* c, 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要
选择这个选项。
* r,把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文
件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项
,将忘记的目录或文件追加到备份文件中。
* t, 列出档案文件的内容,查看已经备份了哪些文件。
* u,更新文件。就是说,用新增的文件取代原备份文件,如果在备份文
件中找不到要更新的文件,则把它追加到备份文件的最后。
* x,从档案文件中释放文件。

辅助选项:

* b,该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,
系统预设值为20(20*512
bytes)。
* f,使用档案文件或设备,这个选项通常是必选的。
* k,保存已经存在的文件。例如我们把某个文件还原,在还原的过程中
,遇到相同的文件,不会进行覆盖。
* m,在还原文件时,把所有文件的修改时间设定为现在。
* M,创建多卷的档案文件,以便在几个磁盘中存放。
* v,详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
* w,每一步都要求确认。
* z,用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩
,但还原时也一定要使用该选项进行解压缩。

命令使用说明:
使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项
是辅助使用的,可以选用。
例子:
  例A:把/home目录下包括它的子目录全部做备份文件,备份文件名为
myfiles.tar。
  $ tar cvf myfiles.tar /home
  例B:把/home目录下包括它的子目录全部做备份文件,并进行压缩,
备份文件名为myfiles.tar.gz。
  $ tar czvf myfiles.tar.gz /home
  例C:把myfiles.tar.gz这个备份文件还原并解压缩。
  $ tar xzvf myfiles.tar.gz
  例D:查看myfiles.tar备份文件的内容,并以分屏方式显示在显示器
上。
  $ tar tvf myfiles.tar | more
  要将文件备份到一个特定的设备,只需把设备名作为备份文件名。
  例E:用户在/dev/fd0设备的软盘中创建一个备份文件,并将/home
目录中所有的文件都拷贝到备份文件中。
  $ tar cf /dev/fd0 /home
  要恢复设备磁盘中的文件,可使用xf选项:
  $ tar xf /dev/fd0
  如果用户备份的文件大小超过设备可用的存贮空间,如软盘,您可以
创建一个多卷的tar备份文件。M选项指示tar命令提示您
使用一个新的存贮设备,当使用M选项向一个软驱进行存档时,tar命令在
一张软盘已满的时候会提醒您再放入一张新的软盘。这样您就可以把tar
档案存入几张磁盘中。
  $ tar cMf /dev/fd0 /home
  要恢复几张盘中的档案,只要将第一张放入软驱,然后输入有x和M选
项的tar命令。在必要时您会被提醒放入另外一张软盘。
  $ tar xMf /dev/fd0
例F:linux下提供的压缩文件大多是*.gz和*.bz2的,常用下面命令
解压。
#tar zvxf *.gz 用来解压*.gz的压缩文件。
#tar jvxf *.bz2 用来解压*.bz2的压缩文件。

.tar
解包: tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)

---------------------------------------------
命令格式:#gzip [[选项]]
常用选顶:

* -c,将输出写到标准输出上,并保留原有文件。
* -d,将压缩文件解压。
* -l,对每个压缩文件,显示下列字段:
  压缩文件的大小
  未压缩文件的大小
  压缩比
  未压缩文件的名字
* -r,递归式地查找指定目录并压缩其中的所有文件或者是解压缩。
* -t,测试,检查压缩文件是否完整。
* -v,对每一个压缩和解压的文件,显示文件名和压缩比。
* -num用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法
(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值
为6。

命令使用说明:
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络
传输文件时,可以减少传输的时间。gzip是在Linu
x系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用

例子:
假设一个目录/home下有文件mm.txt、sort.txt、xx.com。
例A:把/home目录下的每个文件压缩成.gz文件。
  $ cd /home
  $ gzip *
  $ ls
  m.txt.gz sort.txt.gz xx.com.gz
例B:把例A中每个压缩的文件解压,并列出详细的信息。
  $ gzip -dv *
  mm.txt.gz 43.1%-----replaced with mm.txt
  sort.txt.gz 43.1%-----replaced with sort.txt
  xx.com.gz 43.1%-----replaced with xx.com
  $ ls
  mm.txt sort.txt xx.com
例C:详细显示例1中每个压缩的文件的信息,并不解压。
  $ gzip -l *
  compressed uncompr. ratio uncompressed_name
  277 445 43.1% mm.txt
  278 445 43.1% sort.txt
  277 445 43.1% xx.com
  $ ls
  mm.txt.gz sort.txt.gz xx.com.gz
例D:压缩一个tar备份文件,如myfiles.tar,此时压缩文件的扩展名
为.tar.gz
  $ gzip myfiles.tar
  $ ls
  myfiles.tar.gz
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
---------------------------------------------
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
---------------------------------------------
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
---------------------------------------------
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
---------------------------------------------
.tgz
解压:tar zxvf FileName.tgz
压缩:未知
.tar.tgz
解压:tar zxvf FileName.tar.tgz
压缩:tar zcvf FileName.tar.tgz FileName
---------------------------------------------
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
---------------------------------------------
.rar
解压:rar a FileName.rar
压缩:r ar e FileName.rar
rar请到:
http://www.rarsoft.com/download.htm
下载!
解压后请将rar_static拷贝到/usr/bin目录(
其他
由$PATH环境变量指定
的目录也可以):
[root@www2 tmp]# cp rar_static /usr/bin/rar
---------------------------------------------
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName
lha请到:
http://www.infor.kanazawa-it.ac.jp/.../lhaunix/
下载!
>解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录
也可以):
[root@www2 tmp]# cp lha /usr/bin/
---------------------------------------------
.rpm
解包:rpm2cpio FileName.rpm | cpio -div
---------------------------------------------
.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb
.slp .arj .rar .ace .lha .lzh
.lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
解压:sEx x FileName.*
压缩:sEx a FileName.* FileName
sEx只是调用相关程序,本身并无压缩、解压功能,请注意!
sEx请到:
http://sourceforge.net/projects/sex
下载!
解压后请将sEx拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
.tar
解压:tar xvf FileName.tar
压缩:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
---------------------------------------------
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
---------------------------------------------
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
---------------------------------------------
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
---------------------------------------------
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
---------------------------------------------
.tgz
解压:tar zxvf FileName.tgz
压缩:未知
.tar.tgz
解压:tar zxvf FileName.tar.tgz
压缩:tar zcvf FileName.tar.tgz FileName
---------------------------------------------
.a
解压:#tar xv file.a
---------------------------------------------
.cpio.gz/.cgz
解压:gzip -dc file.cgz | cpio -div
---------------------------------------------
.cpio/cpio
解压:cpio -div file.cpio 或cpio -divc file.cpio
---------------------------------------------
.rpm
安装: rpm -i file.rpm
解压:rpm2cpio file.rpm | cpio -div
---------------------------------------------
.deb
安装: dpkg -i file.deb
解压:dpkg-deb --fsys-tarfile file.deb | tar xvf - ar p file.deb data.tar.gz | tar xvzf -
---------------------------------------------
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
---------------------------------------------
.rar
解压:rar a FileName.rar
压缩:rar e FileName.rar
rar请到:
http://www.rarsoft.com/download.htm
下载!
解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp rar_static /usr/bin/rar
---------------------------------------------
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName
lha请到:
http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/
下载!
解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp lha /usr/bin/
---------------------------------------------
.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
解压:sEx x FileName.*
压缩:sEx a FileName.* FileName
sEx只是调用相关程序,本身并无压缩、解压功能,请注意!
sEx请到:
http://sourceforge.net/projects/sex
下载!
解压后请将sEx拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp sEx /usr/bin/
参考文献:
Linux 文件压缩工具指南
(其实看帮助是最好的方法,一般各个命令都可以用“--help”参数得到常用使用方法!)

来源:
http://www.cnblogs.com/campfeather/articles/473999.html
re: Linux:正确安装VMWARE TOOLS 聂文龙 2008-06-09 05:55
一、 虚拟机安装完系统后,在状态栏中一直提醒你安装VMware Tools.因为虚拟机是默认使用自带的虚拟显卡,只有正确安装了VMware Tools后,才能在虚拟机中正确启动REDHAT操作系统,并正确设置显卡以及显示器的分辨率等参数。
注意:在安装好LINUX后再进行此项操作
A.重新启动虚拟机,进入Linux系统,点击Setting(设置)--VMware Tools Install(安装VMware工具)
在弹出的菜单中点击Install,安装VMware工具。
这表示VMware将LINUX的ISO映像文件 作为了虚拟机的光盘。并没有跟你装上Tools,而Windows系统就会的提示安装。
B.其实这时并没有真正地安装上VMware Tools软件包,还须进一步设置。
进入文本登录界面中或在图形界面进入终端
C.在命令行后面输入如下命令(注意大小写和空格,同时每行命令后记住回车)
  mount -t iso9660 /dev/cdrom /mnt (加载CDROM设备,并且CDROM为只读属性。)
  cp /mnt/vmware-linux-tools.tar.gz/tmp (将该软件包持拷贝到LINUX的TMP目录下)
注意:如果版本不同,那么软件包的名字有可能不同,但都差不多会有Linux-tools这些字样。
  umount /dev/cdrom (舍载CDROM)
  cd /tmp (进入TMP目录)
  tar zxf vmware-linux-tools.tar.gz (解压该软件包)
cd vmware-linux-tools (进入解压后的目录)
./linuxinstall.pl (运行安装命令,系统开始安装vmware tools)
注意:最好先Ls一下,查看有没有Linuxinstall.pl的,同样也是由于版本不同名字就有不同,但是.pl结尾也该有Install的字样。如果不是的话会提示不行。到时再试另一个。
D. 在屏幕的提示下(尽量看懂提示,不懂就按回车吧,一般也不会有问题),连续回车后,系统安装完VMWARE TOOLS。安装就完成,接下来是设置
二、 设置显示器的分辨率
如果是在图形界面可以找到相关的图形软件设置。另外可以改配置文件。
 这时虚拟机显示器的分辨率高于本机,由于两机显示器的分辨率的不同将造成图形
窗口的大小不一致,在本机与虚拟机之间相互切换时就很不方便
所以要重新设置虚拟机显示器的分辨率。
  A.在命令行中键入cd /etc/x11(X为大写)。进入配置文件所在的目录,同时输入
   mc命令。
  B.进入MC编辑器,用上下箭头将光标移动到XF86Config-4.vm文件,按下F4,这时将出
   现一个文本窗口,里面显示了配置信息。
  D.显示的配置信息一般在Screen Section标题后面可找到它。
  E 找到显示器的分辨率之后,将Modes中高于本机的ms windows所用的分辨率全部
   删除,删除务必从高分辨率向低分辨率删除,以免出现漏洞。
  F.保存修改的信息,退到X11目录下,输入startx进入图形界面,虚拟机内的操作系统的分辨率就发生了改变。
Linux上安装GCC编译器过程


  2004年4月20日最新版本的GCC编译器3.4.0发布了。目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。GCC 3.4.0比以前版本更好地支持了C++标准。本文以在Redhat Linux上安装GCC3.4.0为例,介绍了GCC的安装过程。

  安装之前,系统中必须要有cc或者gcc等编译器,并且是可用的,或者用环境变量CC指定系统上的编译器。如果系统上没有编译器,不能安装源代码形式的GCC 3.4.0。如果是这种情况,可以在网上找一个与你系统相适应的如RPM等二进制形式的GCC软件包来安装使用。本文介绍的是以源代码形式提供的GCC软件包的安装过程,软件包本身和其安装过程同样适用于其它Linux和Unix系统。

  系统上原来的GCC编译器可能是把gcc等命令文件、库文件、头文件等分别存放到系统中的不同目录下的。与此不同,现在GCC建议我们将一个版本的GCC安装在一个单独的目录下。这样做的好处是将来不需要它的时候可以方便地删除整个目录即可(因为GCC没有uninstall功能);缺点是在安装完成后要做一些设置工作才能使编译器工作正常。在本文中我采用这个方案安装GCC 3.4.0,并且在安装完成后,仍然能够使用原来低版本的GCC编译器,即一个系统上可以同时存在并使用多个版本的GCC编译器。

  按照本文提供的步骤和设置选项,即使以前没有安装过GCC,也可以在系统上安装上一个可工作的新版本的GCC编译器。

  1. 下载

  在GCC网站上(http://gcc.gnu.org/)或者通过网上搜索可以查找到下载资源。目前GCC的最新版本为 3.4.0。可供下载的文件一般有两种形式:gcc-3.4.0.tar.gz和gcc-3.4.0.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。

  2. 解压缩

  根据压缩格式,选择下面相应的一种方式解包(以下的“%”表示命令行提示符):

  % tar xzvf gcc-3.4.0.tar.gz
  或者
  % bzcat gcc-3.4.0.tar.bz2 | tar xvf -

  新生成的gcc-3.4.0这个目录被称为源目录,用${srcdir}表示它。以后在出现${srcdir}的地方,应该用真实的路径来替换它。用pwd命令可以查看当前路径。

  在${srcdir}/INSTALL目录下有详细的GCC安装说明,可用浏览器打开index.html阅读。

  3. 建立目标目录

  目标目录(用${objdir}表示)是用来存放编译结果的地方。GCC建议编译后的文件不要放在源目录${srcdir]中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是${srcdir}的子目录。

  例如,可以这样建立一个叫 gcc-build 的目标目录(与源目录${srcdir}是同级目录):

  % mkdir gcc-build
  % cd gcc-build

  以下的操作主要是在目标目录 ${objdir} 下进行。

  4. 配置

  配置的目的是决定将GCC编译器安装到什么地方(${destdir}),支持什么语言以及指定其它一些选项等。其中,${destdir}不能与${objdir}或${srcdir}目录相同。

  配置是通过执行${srcdir}下的configure来完成的。其命令格式为(记得用你的真实路径替换${destdir}):

  % ${srcdir}/configure --prefix=${destdir} [其它选项]

  例如,如果想将GCC 3.4.0安装到/usr/local/gcc-3.4.0目录下,则${destdir}就表示这个路径。

  在我的机器上,我是这样配置的:

  % ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java

  将GCC安装在/usr/local/gcc-3.4.0目录下,支持C/C++和JAVA语言,其它选项参见GCC提供的帮助说明。

  5. 编译

  % make

  这是一个漫长的过程。在我的机器上(P4-1.6),这个过程用了50多分钟。

  6. 安装

  执行下面的命令将编译好的库文件等拷贝到${destdir}目录中(根据你设定的路径,可能需要管理员的权限):

  % make install

  至此,GCC 3.4.0安装过程就完成了。

  6. 其它设置

  GCC 3.4.0的所有文件,包括命令文件(如gcc、g++)、库文件等都在${destdir}目录下分别存放,如命令文件放在bin目录下、库文件在lib下、头文件在include下等。由于命令文件和库文件所在的目录还没有包含在相应的搜索路径内,所以必须要作适当的设置之后编译器才能顺利地找到并使用它们。

  6.1 gcc、g++、gcj的设置

  要想使用GCC 3.4.0的gcc等命令,简单的方法就是把它的路径${destdir}/bin放在环境变量PATH中。我不用这种方式,而是用符号连接的方式实现,这样做的好处是我仍然可以使用系统上原来的旧版本的GCC编译器。

  首先,查看原来的gcc所在的路径:

  % which gcc

  在我的系统上,上述命令显示:/usr/bin/gcc。因此,原来的gcc命令在/usr/bin目录下。我们可以把GCC 3.4.0中的gcc、g++、gcj等命令在/usr/bin目录下分别做一个符号连接:

  % cd /usr/bin
  % ln -s ${destdir}/bin/gcc gcc34
  % ln -s ${destdir}/bin/g++ g++34
  % ln -s ${destdir}/bin/gcj gcj34

  这样,就可以分别使用gcc34、g++34、gcj34来调用GCC 3.4.0的gcc、g++、gcj完成对C、C++、JAVA程序的编译了。同时,仍然能够使用旧版本的GCC编译器中的gcc、g++等命令。

  6.2 库路径的设置

  将${destdir}/lib路径添加到环境变量LD_LIBRARY_PATH中,最好添加到系统的配置文件中,这样就不必要每次都设置这个环境变量了。

  例如,如果GCC 3.4.0安装在/usr/local/gcc-3.4.0目录下,在RH Linux下可以直接在命令行上执行或者在文件/etc/profile中添加下面一句:

  setenv LD_LIBRARY_PATH /usr/local/gcc-3.4.0/lib:$LD_LIBRARY_PATH

  7. 测试

  用新的编译命令(gcc34、g++34等)编译你以前的C、C++程序,检验新安装的GCC编译器是否能正常工作。

  8. 根据需要,可以删除或者保留${srcdir}和${objdir}目录。

  后记:

  前两天刚安装好了GCC 3.4.0,把安装规划、安装过程、一些注意事项记录下来就形成了这篇文章。希望对大家、特别是还没有安装过GCC的朋友在安装GCC的时候有所帮助。
关于不同版本gcc和不同版本glibc共存的问题


每个编译器都一个specs文件,你可以修改相应的specs文件,就拿我机器上的来说吧,gcc4的specs是在/usr/lib/gcc/i386-redhat-linux/4.0.0/specs

gcc 2.91.66的specs是在/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs

具体的做法可以在编译glibc的时候通过congfigure把生成的lib放到不同的目录中

通过修改gcc的specs可以让,link的时候去选择自己想要的glibc

想要分开安装的话,就要自己编译source code,不要用rpm
re: 在Linux下安装和使用MySQL 聂文龙 2008-06-03 16:36
如果你想连接你的mysql的时候发生这个错误:

以下是引用内容:
ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server



解决方法:
1。 改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"

mysql -u root -pvmwaremysql>use mysql;mysql>update user set host = '%' where user = 'root';mysql>select host, user from user;


2. 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;


如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
svn import D:\develop\vc++\qq2006winsrc svn://localhost/qq2006winsrc -m "initial import" --username niewenlong --password niewenlong
re: 热血传奇经验等级对照表 聂文龙 2008-03-30 06:55
热血传奇各级经验升级所需元宝及天数!

首先说明:以下统计数字,均以纯用元宝挂金刚石升级(即假设:不手动练级、不开箱子、不闯天关得经验,)为参照,再者以下统计数字精确率在95%左右。
01-02级:100
02-03级:200
03-04级:300
04-05级:400
05-06级:600
06-07级:900
07-08级:1200
08-09级:1700
09-10级:2500
1-10级由于不能进入庄园,故需手动升级。用时2小时左右。
10-11级:6000
11-12级:8000
12-13级:10000
13-14级:1.5W
14-15级:3W
15-16级:4W
16-17级:5W
17-18级:7W
18-19级:10W
19-20级:12W
20-21级:14W
21-22级:25W
22-23级:30W
23-24级:35W
24-25级:40W
25-26级:50W
26-27级:70W
27-28级:100W
28-29级:140W
29-30级:180W
30-31级:200W
31-32级:240W
32-33级:280W
33-34级:320W
34-35级:360W
10级-35级升级经验合计为2132.9W,需50元宝,用时13天左右。
35-36级:400W
36-37级:480W
37-38级:560W
38-39级:820W
39-40级:900W
35级-40级升级经验合计为3160W,需70元宝,用时18天左右。
40-41级:1200W
41-42级:1600W
42-43级:3000W
43-44级:5000W
44-45级:8000W
40级-45级升级经验合计为1.88亿,需360元宝,用时90天左右。
45-46级:1.2亿 200元宝,用时50天左右。
46-47级:4.8亿 800元宝,用时200天左右。
47-48级:3.6亿 600元宝,用时150天左右。
48-49级:4亿 720元宝,用时180天左右。
49-50级:4.2亿 730元宝,用时180天左右。
50-51级:4.3亿 740元宝,用时180天左右。
51-52级:4.4亿 750元宝,用时180天左右。
52-53级:4.6亿 760元宝,用时180天左右。
53-54级:4.8亿 800元宝,用时200天左右。
54-55级:5亿 810元宝,用时200天左右。
以下各级按金刚石 25W/块 计算即可得出。
55-56级:5.2亿
56-57级:5.5亿
57-58级:6亿
58-59级:7亿
59-60级:8亿


re: svn服务器安装配置 聂文龙 2007-10-12 15:21
前一阵子项目开发的时候用到版本管理,以前用的是VSS,现在准备用一下SVN,摸索了一阵子,大概搞清了怎么配置和使用。与VSS相比,我个人觉得SVN使用起来方便些。

首先是软件的安装,我们这里要用到两个软件,一个是服务器端软件subversion,一个是客户端TortoiseSVN。两个都是免费软件。下载的地址在网上有很多地方介绍,但对可怜的教育网或没有上国际网的同胞来说,那是一个比较困难的事实。因为网上给出的地址绝大部分是软件的官方网址,是国外网。而在国外,本人几乎很难搜到顺利下载的地址。直到利用迅雷搜索,才顺利解决软件下载问题。服务器端和客户端版本理论上应该配套,但客户端版本比服务器端新也是没问题的。

服务器软件可能是不需要安装的,那就更好。客户端应该是属于安装形式。如果不懂无需安装的软件要进行一系列烦琐的命令配置,最好是下载那些安装型的,这样,它会在安装过程中自动进行一些必须的配置。服务器端和客户端安装的顺序无关紧要。

服务器应该安装服务器和客户端,客户机只需要安装客户端。事实上,如果服务器机不安装服务器端软件也行,客户端TortoiseSVN自带有服务器,但是在本人使用的过程中,远程客户端不方便访问,并且提交的速度慢得难以忍受。如果进行单机版本管理的话,无需安装服务端,也没有问题。

服务器端:服务器端软件subversion是属于命令行式的,没有图形化操作界面,这对于生手来说有点麻烦,不过所幸的是,我们只需记住一条命令即可。其余的都可以通过客户端来控制。这条命令是svnserve -d -r 版本存放地址。在这之前,使用右键的方式,创建一个版本存放仓库等等,进行一些必要的操作(这里不再说明,这完全是得用客户端软件进行的,网上有很多说明,搜索TortoiseSVN的使用方法就可以得到完整说明)。虽然利用客户端软件,但进行地却服务器软件的操作同样的效果。不妨假设先在E盘创建文件夹:E:\svnServer。并在此文件夹创建一版本存放仓库。此时开始-运行-cmd,在出现的窗口中,利用上面提到的命令svnserve -d -r e:\svnServer。这样就启动了版本服务器了。注意不能关闭些窗口,否则版本服务器也随之关闭。如果你使用的不是安装型的软件,那么这条命令会报错。因为没有进行环境变量的设置。

客户端:对客户端的操作不准备多说,网上随处可见。只是在checkout或commit ,update等操作的时候,在URL of repository(版本仓库地址)中输入格式为svn://服务器ip/文件夹名。如svn://245.38.100.245/che。这里che是建在服务器文件夹e:\svnServer\che\。因为e:\svnServer是一个总仓库,里面可管理多个项目,每个项目存放一个不同的文件夹。至于用户密码管理等等,这些网上都有很多说明。可以自己去找找。

最后附上SVN在linux下的注意事项和常用的命令

发生冲突时:
svn revert 扔掉自己的修改,使用仓库中的文件版本
如果保留自己的改动,丢掉其它人的改动,则:
cp number.txt.mine number.txt
svn resolved number.txt
如果想用另外方式修改一下用svn resolved number.txt

svn log [-r 16:24] clock.java [|more]查看日志
svn blame number.txt 显示一个或多个文件的内容。对于每个文件的每一行,显示改动了那行的最后版本以及作出改动的人。

svn diff [-r 27:26] number.txt 查看(版本27与版本26之间)的差异
svn merge -r 27:26 number.txt 移除版本27中对number.txt的改动
svn merge -r 27:26 . 撤销版本27对当前目录的所有改动,点表示当前目录
svn status [--show-updates] 查看工作版本的状态(与服务器对照)

当锁住文件的用户对文件进行提交后,文件即被解锁

svn add number.txt , svn commit 添加文件

svn co 签出文件co即为checkout

svn info number.txt查看文件number.txt信息

svn move 移动文件或重命名

创建分支(发布或修正BUG):
svn mkdir -m "msg" svn://ip/sesame/branches 可以同时创建多个目录,用空格分开即可
svn copy -m "msg" svn://ip//sesame/trunks svn://ip/sesame/branches/RB-1.0
svn commit

访问发布分支,从分支签出即可。

签出到当前目录的rb1.0文件夹 svn co svn://ip/ rb1.0
re: svn服务器安装配置 聂文龙 2007-10-12 15:19
一 需要资源:
1 apache server 。下载地址:www.apache.org
这里我们选择2.0版
2 subversion 服务器包。下载地址:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
这里我们选择1.4.3版
3 Subversion 客户端。下载地址:http://sourceforge.net/projects/tortoisesvn/
这里我们选择1.4.3版

二 创建和配置存储仓库:
1 解压subversion服务器服务器包到本地任何目录,打开CMD 命令框,cd 目录到 subversion root/bin。
使用命令svnadmin :
svnadmin create D:\repository\subversion\projectname
(D:\repository\subversion 存储库根目录. Projectname 工程名 )
如果执行成功,上述命令会在D:\repository\subversion\projectname 中自动生成多个文件和文件夹。

2 安装apache server,所有的配置按照安装程序提供的默认选项即可。
默认的安装文件根路径一般为:系统盘:\Program Files\Apache Group\Apache2
修改apache server root/conf/httpd.conf 文件
A 将LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dir_module modules/mod_dir.so
之前的# 去掉
B 在LoadModule list 的最后加入
如下内容:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
将subversion root/bin目录下的.dll 和 .so文件Copy到apache server root/modules文件夹下
C 在文件最后 加入如下信息
<Location /svn>
DAV svn
SVNParentPath d:\svn\repository
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile passwd
#AuthzSVNAccessFile svnaccessfile
Require valid-user
</Location>
加入上述配置信息后
http根目录:http://yourServer/svn/">http://yourServer/svn/
subversion本地存储库根目录: d:\svn\repository
使用“passwd”文件中username/password(用户名/密码)列表访问http://yourServer/svn/">http://yourServer/svn/
此passwd密码文件位于apache server root目录下
可以通过apache server root/bin 目录下的htpasswd.exe 命令生成
命令使用方式:htpasswd -c passwd <username>
-c 参数表示重新创建密码文件,如果不需重新创建passwd文件而只增加用户,将-c参数去掉。
注意:密码文件生成后,确保passwd文件位于apache server root目录下,如果不在直接Copy过去

3 安装Subversion 客户端
安装完成后,系统的右键菜单会多出Subversion的控制选项,

三引入控管源码
在需要控管的源码文件夹上点击右键,在菜单中顺序选择 TortoiseSVN--》Import
弹出一个对话框,在对话框的上部URL of repository:框中输入前面创建的存储库
Http URL 本例为:http://yourServer/svn/">http://yourServer/svn/projectname
然后点击OK按钮即可。

整个过程就这样简单的做完了,现在你就可以和你的团体合作开发而不必要再为修改冲突担心了

re: svn服务器安装配置 聂文龙 2007-10-12 15:11
1.下载文件
下载最新版本subversion,我这里选择svn-1.3.2-setup.exe
下载 "Subversion Windows Service" 软件包
下载 TortoiseSVN shell integration utility
2.安装Subversion 服务器
由于我下载的是setup.exe版本,安装程序安装后会自动设置系统变量.如果你下载的是zip版就需要手动设置系统变量.
setup.exe版直接安装就可以了.安装到D:\Program Files\Subversion

首先创建SVN储存库(repository)

svnadmin create F:\lava\svn\
repository创建完毕后会在目录下生成若干个文件和文件夹,dav目录是提供给Apache与mod_dav_svn使用的目录,让它们存储内部 数据;db目录就是所有版本控制的数据文件;hooks目录放置hook脚本文件的目录;locks用来放置Subversion文件库锁定数据的目录, 用来追踪存取文件库的客户端;format文件是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号;

3.配置SVN服务器
打开/conf/目录,打开svnserve.conf找到一下两句:

# [general]
# password-db = passwd

去之每行开头的#,其中第二行是指定身份验证的文件名,即passwd文件
同样打开passwd文件,将

# [users]
# harry = harryssecret
# sally = sallyssecret

这几行的开头#字符去掉,这是设置用户,一行一个,存储格式为“用户名 = 密码”,如可插入一行:admin = admin888,即为系统添加一个用户名为admin,密码为admin888的用户


4.运行SVN服务器
运行SVN服务
在命令行执行

svnserve --daemon --root F:\lava\svn
服务启动,--daemon可简写为-d,--root可简写为-r,可以建立一个批处理文件并放在windows启动组中便于开机就运行SVN服务,或者在这个地址http://clanlib.org/~mbn/svnservice/下载那个svnservice.exe文件,拷贝到E:\svn\bin目录下,再从命令行下执行:

svnservice -install --daemon --root "E:\svn\Repository"
sc config svnservice start= auto
net start svnservice

re: svn服务器安装配置 聂文龙 2007-10-12 15:09
创建仓库 svnadmin create /home/svnroot/repository


修改配置文件/home/svnroot/repository/conf/svnserve.conf
[general]
#匿名访问的权限,可以是read,write,none,默认为read
anon-access = none
#认证用户的权限,可以是read,write,none,默认为write
auth-access = write
#密码数据库的路径,去掉前面的#

password-db = passwd

#用户操作权限#

authz-db = authz


修改配置文件passwd
[users]
user = passwod

user1 = password1


修改配置文件authz

[test1:/]

user = rw

[test1:/doc]

user1 = rw


对于单个代码仓库

启动命令 svnserve -d -r /home/svnroot/repository/test1 --listen-host 192.168.1.18

其中-d表示在后台运行,-r指定服务器的根目录,这样访问服务器时就可以直接用svn://服务器ip来访问了。如果服务器有多ip的话--listen-host来指定监听的ip地址。

我们可以在svn客户端中通过svn://192.168.1.18来访问svn服务器。

对于多个代码仓库,我们在启动时也可以用-r选项来指定服务器根目录,但访问时需要写上每个仓库相对于svn根目录的相对路径。

比如,我们有两个代码仓库/home/svnroot/repository/test1 和/home/svnroot/repository/test2,我们用svnserve -d -r /home/svnroot/repository --listen-host 192.168.1.18来启动,那么在客户端访问时可以用svn://192.168.1.18/test1和svn://192.168.1.200/test2来分别访问两个项目

启动完成以后,我们可以用ps aux|grep svnserv来查看是否存在svnserve进程。


开放服务器端口

SVN默认端口是3690,你需要在防火墙上开放这个端口。

/sbin/iptables -A INPUT -i eth0 -p tcp --dport 3690 -j ACCEPT

/sbin/service iptables save

你也可以通过svnserve的--listen-port选项来指定一个已经开放的其他端口,不过这样的话客户端使用也必须加上端口,如svn://192.168.1.18:9999/。
共5页: 1 2 3 4 5