vboxmanage modifyvm VMName --macaddress1 auto
One day when Sean was reading under his apple tree, a dice fell down onto his head... Why dice?
Wednesday, 22 May 2013
Thursday, 21 March 2013
Monday, 25 February 2013
Add user for Virtualbox USB
usermod seanchu -a -G vboxusers
Friday, 22 February 2013
samba mount
sudo mount -t cifs //192.168.0.7/H/ /home/seanchu/H/ -o username=Sean
Thursday, 21 February 2013
For loop in shell
for i in $(seq 5)
do
echo "Welcome $i times"
done
Wednesday, 20 February 2013
Install tmux on server
ssh username@server.com
mkdir local
mkdir tmp
mv tmux-1.4.tar.gz tmp
mv ncurses-5.7.tar.gz tmp
mv libevent-2.0.10-stable.tar.gz tmp
cd tmp
tar xvfz tmux-1.4.tar.gz
tar xvfz ncurses-5.7.tar.gz
tar xvfz libevent-2.0.10-stable.tar.gz
cd libevent-2.0.10-stable
./configure --prefix=$HOME/local
make
make install
cd ../ncureses-5.7
./configure --prefix=$HOME/local
make
make install
cd ../tmux-1.4
./configure
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
/***make install DOESN'T WORK, SO DON'T EVEN TRY, also -static makes it so we don't need to dynamically link shared files in $HOME/local/lib meaning exporting a LD shell variable. We can just copy it and run it. Note: that whole long line above is a single command, run it all together!***/
cp tmux ~/local/bin
export PATH=$HOME/local/bin:$PATH
/***At this point, you should be able to just type tmux on the command line and have it work. Otherwise, the binary was installed to $HOME/local/bin, and you can run it by changing directories to there.***/
sometimes ./configure --prefix= will do the trick
Monday, 18 February 2013
kill process in Linux
linux下查找进程及终止进程操作的相关命令
首先,我们需要使用linux下另外一个命令ps查找与进程相关的PID号:ps aux | grep program_filter_word
1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。
2)ps -A 显示所有程序。
3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
4)ps -e 此参数的效果和指定"A"参数相同。
5)ps e 列出程序时,显示每个程序所使用的环境变量。
6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
7)ps -H 显示树状结构,表示程序间的相互关系。
8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
9)ps s 采用程序信号的格式显示程序状况。
10)ps S 列出程序时,包括已中断的子程序资料。
11)ps -t<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
12)ps u 以用户为主的格式来显示程序状况。
13)ps x 显示所有程序,不以终端机来区分。
最常用的方法是ps aux,然后再通过管道使用grep命令过滤查找特定的进程,然后再对特定的进程进行操作。
其次,使用kill命令结束进程:kill xxx
1)作用
kill命令用来中止一个进程。
2)格式
kill [ -s signal | -p ] [ -a ] pid ...
kill -l [ signal ]
3)参数
-s:指定发送的信号。
-p:模拟发送信号。
-l:指定信号的名称列表。
pid:要中止进程的ID号。
Signal:表示信号。
4)说明
进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,所关心的是如何去控制这些进程,让它们能够很好地为用户服务。
Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个进程序列。监控进程(也称系统守护进程)是Linux系统启动时启动的进程,并在后台运行。例如,httpd是著名的Apache服务器的监控进程。
kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。比如在top命令中,我们看到系统运行许多进程,有时就需要使用kill中止某些进程来提高系统资源。在讲解安装和登陆命令时,曾提到系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时,可以切换到其它虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。
5)应用实例
(1)强行中止(经常使用杀掉)一个进程标识号为324的进程:
#kill -9 324
(2)解除Linux系统的死锁
在 Linux中有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。此时一般不用重新启动计算机,只需要中止(或者说是关闭)这个有问题的程序即可。当kill处于X-Window界面时,主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端,在那里中止有问题的程序。比如,如果Mozilla浏览器程序出现了锁死的情况,可以使用kill命令来中止所有包含有Mozolla浏览器的程序。首先用ps命令查找该程序的 PID,然后使用kill命令停止这个程序:
#kill -SIGKILL XXX
其中,XXX是包含有Mozolla浏览器的程序的进程标识号。
(3)使用命令回收内存
我们知道内存对于系统是非常重要的,回收内存可以提高系统资源。kill命令可以及时地中止一些“越轨”的程序或很长时间没有相应的程序。例如,使用top命令发现一个无用 (Zombie) 的进程,此时可以使用下面命令:
#kill -9 XXX
其中,XXX是无用的进程标识号。
然后使用下面命令:
#free
此时会发现可用内存容量增加了。
(4)killall命令
Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:
# killall -HUP inetd
kill process in Linux
linux下查找进程及终止进程操作的相关命令
首先,我们需要使用linux下另外一个命令ps查找与进程相关的PID号:ps aux | grep program_filter_word
1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。
2)ps -A 显示所有程序。
3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
4)ps -e 此参数的效果和指定"A"参数相同。
5)ps e 列出程序时,显示每个程序所使用的环境变量。
6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
7)ps -H 显示树状结构,表示程序间的相互关系。
8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
9)ps s 采用程序信号的格式显示程序状况。
10)ps S 列出程序时,包括已中断的子程序资料。
11)ps -t<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
12)ps u 以用户为主的格式来显示程序状况。
13)ps x 显示所有程序,不以终端机来区分。
最常用的方法是ps aux,然后再通过管道使用grep命令过滤查找特定的进程,然后再对特定的进程进行操作。
其次,使用kill命令结束进程:kill xxx
1)作用
kill命令用来中止一个进程。
2)格式
kill [ -s signal | -p ] [ -a ] pid ...
kill -l [ signal ]
3)参数
-s:指定发送的信号。
-p:模拟发送信号。
-l:指定信号的名称列表。
pid:要中止进程的ID号。
Signal:表示信号。
4)说明
进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,所关心的是如何去控制这些进程,让它们能够很好地为用户服务。
Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个进程序列。监控进程(也称系统守护进程)是Linux系统启动时启动的进程,并在后台运行。例如,httpd是著名的Apache服务器的监控进程。
kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。比如在top命令中,我们看到系统运行许多进程,有时就需要使用kill中止某些进程来提高系统资源。在讲解安装和登陆命令时,曾提到系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时,可以切换到其它虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。
5)应用实例
(1)强行中止(经常使用杀掉)一个进程标识号为324的进程:
#kill -9 324
(2)解除Linux系统的死锁
在 Linux中有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。此时一般不用重新启动计算机,只需要中止(或者说是关闭)这个有问题的程序即可。当kill处于X-Window界面时,主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端,在那里中止有问题的程序。比如,如果Mozilla浏览器程序出现了锁死的情况,可以使用kill命令来中止所有包含有Mozolla浏览器的程序。首先用ps命令查找该程序的 PID,然后使用kill命令停止这个程序:
#kill -SIGKILL XXX
其中,XXX是包含有Mozolla浏览器的程序的进程标识号。
(3)使用命令回收内存
我们知道内存对于系统是非常重要的,回收内存可以提高系统资源。kill命令可以及时地中止一些“越轨”的程序或很长时间没有相应的程序。例如,使用top命令发现一个无用 (Zombie) 的进程,此时可以使用下面命令:
#kill -9 XXX
其中,XXX是无用的进程标识号。
然后使用下面命令:
#free
此时会发现可用内存容量增加了。
(4)killall命令
Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:
# killall -HUP inetd
Wednesday, 13 February 2013
transmission remotely add torrent
NAME
transmission-remote - a remote control utility for transmission-daemon(1)
and transmission(1)
SYNOPSIS
transmission-remote [host:port | host | port] [-a torrent-files] [-b]
[-d number | -D] [-er | -ep | -et] [-f] [-g files]
[-G files] [-h] [-i] [-l] [-m | -M] [-n user:pass]
[-p port] [-ph files] [-pl files] [-pn files] [-r]
[-s | -S] [-t all | id | hash] [-u number | -U] [-v]
[-w download-dir] [-x | -X]
DESCRIPTION
transmission-remote is a remote control utility for transmission(1) and
transmission-daemon(1).
By default, transmission-remote connects to the transmission session at
localhost:9091. Other sessions can be controlled by specifying a
different host and/or port.
OPTIONS
-a --add torrent-file(s)
Add torrent-file(s) into transmission.
-b --debug
Enable debugging mode.
-d --downlimit limit
Limit the download speed to limit kilobytes per second.
-D --no-downlimit
Remove the download limit.
-er --encryption-required
Encrypt all peer connections.
-ep --encryption-preferred
Prefer encrypted peer connections.
-et --encryption-tolerated
Prefer unencrypted peer connections.
-f --files
Get a file list for the current torrent(s)
-g --get all | file-index | files
Mark file(s) for download. all marks all all of the torrent’s
files for downloading, file-index adds a single file to the
download list, and files adds multiple files to the download
list, such as "-g1,3-5" to add files #1, #3, #4, and #5 to the
download list.
-G --no-get all | file-index | files
Mark file(s) for not downloading.
-h --help
Print command-line option descriptions.
-i --info id | torrent-hash
Show details of the current torrent(s)
-l --list
List all torrents
-m --portmap
Enable portmapping via NAT-PMP or UPnP
-M --no-portmap
Disable portmapping
-n --auth username:password
Set the username and password for authentication
-p --port port
Set the port for use when listening for incoming peer connections
-pn --priority-normal all | file-index | files
Mark file(s) as normal priority. all marks all of the torrent’s
files as normal priority, file-index sets a single file’s
priority as normal, and files sets multiple files’ priorities as
normal, such as "-pn1,3-5" to normalize files #1, #3, #4, and #5.
-ph --priority-high all | file-index | files
Mark file(s) as high priority.
-pl --priority-low all | file-index | files
Mark file(s) as low priority.
-r --remove
Remove the current torrent(s). This does not delete the
downloaded data.
-s --start
Start the current torrent(s)
-S --stop
Stop the current torrent(s) from downloading or seeding
-t --torrent all | id | torrent-hash
Set the current torrent(s) for use by subsequent options. all
will apply following requests to all torrents, while specific
torrents can be chosen by id or hash. To set more than one
current torrent, join their ids or hashes together in a list,
such as "-t2,4,6-8" to operate on the torrents whose IDs are 2,
4, 6, 7, and 8.
-u --uplimit limit
Limit the upload speed to limit kilobytes per second.
-U --no-uplimit
Remove the upload limit.
-v --verify
Verify the current torrent(s)
-w --download-dir directory
Use directory as the default location for newly added torrents to
download files to.
-x --pex
Enable peer exchange (PEX).
-X --no-pex
Disable peer exchange (PEX).
EXAMPLES
Set download and upload limits to 100 KiB/sec and 20 KiB/sec:
$ transmission-remote -d100 -u20
$ transmission-remote --downlimit=100 --uplimit=20
List all torrents’ IDs and states:
$ transmission-remote -l
List all torrents from a remote session that requires authentication:
$ transmission-remote host:9091 --auth=username:password -l
Start all torrents:
$ transmission-remote -tall --start
Add two torrents:
$ transmission-remote -a one.torrent two.torrent
Add all torrents in ~/Desktop:
$ transmission-remote -a ~/Desktop/*torrent
Get detailed information on the torrent whose ID is ’1’:
$ transmission-remote -t1 -i"
Get a list of a torrent’s files:
$ transmission-remote -t1 -l"
Download only its second and fourth files:
$ transmission-remote -t1 -Gall -g2,4"
Set all torrents’ first two files’ priorities to high:
$ transmission-remote -tall -ph1,2"
Set all torrents’ files’ priorities to normal:
$ transmission-remote -tall -pnall"
AUTHORS
Charles Kerr, Josh Elsasser, Eric Petit, and Mitchell Livingston.
SEE ALSO
transmissioncli(1), transmission-daemon(1), transmission(1)
http://www.transmissionbt.com/
Tuesday, 12 February 2013
export PATH in linux
在Linux里设置环境变量的方法(export PATH)
一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录下,build_tools就是我的编译工具,则有如下三种方法来设置环境变量:
1、直接用export命令:
#export PATH=$PATH:/opt/au1200_rm/build_tools/bin
查看是否已经设好,可用命令export查看:
[root@localhost bin]# export
declare -x BASH_ENV="/root/.bashrc"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="localhost.localdomain"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="zh_CN.GB18030"
declare -x LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/opt/au1200_rm/build_tools"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/opt/au1200_rm/build_tools/bin"
declare -x PWD="/opt/au1200_rm/build_tools/bin"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_AUTH_SOCK="/tmp/ssh-XX3LKWhz/agent.4242"
declare -x SSH_CLIENT="10.3.37.152 2236 22"
declare -x SSH_CONNECTION="10.3.37.152 2236 10.3.37.186 22"
declare -x SSH_TTY="/dev/pts/2"
declare -x TERM="linux"
declare -x USER="root"
declare -x USERNAME="root"
可以看到,环境变量已经设好,PATH里面已经有了我要加的编译器的路径。
2、修改profile文件:
#vi /etc/profile
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
3. 修改.bashrc文件:
# vi /root/.bashrc
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
后两种方法一般需要重新注销系统才能生效,最后可以通过echo命令测试一下:
# echo $PATH
看看输出里面是不是已经有了/my_new_path这个路径了。
-----------------------------------------------------------------------------------------------------------------------
“/bin”、“/sbin”、“/usr/bin”、“/usr/sbin”、“/usr/local/bin”等路径已经在系统环境变量中了,如果可执行文件在这几个标准位置,在终端命令行输入该软件可执行文件的文件名和参数(如果需要参数),回车即可。
如果不在标准位置,文件名前面需要加上完整的路径。不过每次都这样跑就太麻烦了,一个“一劳永逸”的办法是把这个路径加入环境变量。命令 “PATH=$PATH:路径”可以把这个路径加入环境变量,但是退出这个命令行就失效了。要想永久生效,需要把这行添加到环境变量文件里。有两个文件可 选:“/etc/profile”和用户主目录下的“.bash_profile”,“/etc/profile”对系统里所有用户都有效,用户主目录下 的“.bash_profile”只对这个用户有效。
“PATH=$PATH:路径1:路径2:...:路径n”,意思是可执行文件的路径包括原先设定的路径,也包括从“路径1”到“路径n”的所 有路径。当用户输入一个一串字符并按回车后,shell会依次在这些路径里找对应的可执行文件并交给系统核心执行。那个“$PATH”表示原先设定的路径 仍然有效,注意不要漏掉。某些软件可能还有“PATH”以外类型的环境变量需要添加,但方法与此相同,并且也需要注意“$”。
注意,与DOS/Window不同,UNIX类系统环境变量中路径名用冒号分隔,不是分号。另外,软件越装越多,环境变量越添越多,为了避免造成混乱,建议所有语句都添加在文件结尾,按软件的安装顺序添加。
格式如下():
# 软件名-版本号
PATH=$PATH:路径1:路径2:...:路径n
其他环境变量=$其他环境变量:...
在“profile”和“.bash_profile”中,“#”是注释符号,写在这里除了视觉分隔外没有任何效果。
设置完毕,注销并重新登录,设置就生效了。如果不注销,直接在shell里执行这些语句,也能生效,但是作用范围只限于执行了这些语句的shell。
相关的环境变量生效后,就不必老跑到软件的可执行文件目录里去操作了。
cmake: how to use
CMAKE的使用
Version 1.0
2009-3-18
一、 基本使用
安装:下载二进制包后可直接解压使用
从源码安装则执行命令:./bootstrap; make; make install——尝试执行bootstrap失败
使用:cmake dir_path,生成工程文件或makefile文件
二、 概念
out-of-source build,与in-source build相对,即将编译输出文件与源文件放到不同目录中;
三、 基本结构
1,依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含的子目录;
2,在项目CMakeLists.txt中使用project指定项目名称,add_subdirectory添加子目录
3,子目录CMakeLists.txt将从父目录CMakeLists.txt继承设置(TBD,待检验)
四、 语法
1. #注释
2. 变量:使用set命令显式定义及赋值,在非if语句中,使用${}引用,if中直接使用变量名引用;后续的set命令会清理变量原来的值;
3. command (args ...) #命令不分大小写,参数使用空格分隔,使用双引号引起参数中空格
4. set(var a;b;c) <=> set(var a b c) #定义变量var并赋值为a;b;c这样一个string list
5. Add_executable(${var}) <=> Add_executable(a b c) #变量使用${xxx}引用
6. 条件语句:
if(var) #var 非empty 0 N No OFF FALSE... #非运算使用NOT
…
else()/elseif() … endif(var)
7. 循环语句
Set(VAR a b c)
Foreach(f ${VAR}) …Endforeach(f)
8. 循环语句
WHILE() … ENDWHILE()
五、 内部变量
CMAKE_C_COMPILER:指定C编译器
CMAKE_CXX_COMPILER:
CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项
EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径
LIBRARY_OUTPUT_PATH:库文件路径
??????CMAKE_BUILD_TYPE::build 类型(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug
BUILD_SHARED_LIBS:Switch between shared and static libraries
内置变量的使用:
>> 在CMakeLists.txt中指定,使用set
>> cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF
六、 命令
project (HELLO) #指定项目名称,生成的VC项目的名称;
>>使用${HELLO_SOURCE_DIR}表示项目根目录
include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数
>> include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录
link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
>> link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello为link目录
add_subdirectory:包含子目录
>> add_subdirectory (Hello)
add_executable:编译可执行程序,指定编译,好像也可以添加.o文件
>> add_executable (helloDemo demo.cxx demo_b.cxx) #将cxx编译成可执行文件——
add_definitions:添加编译参数
>> add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;
>> add_definitions( “-Wall -ansi –pedantic –g”)
target_link_libraries:添加链接库,相同于指定-l参数
>> target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo
add_library:
>> add_library(Hello hello.cxx) #将hello.cxx编译成静态库如libHello.a
add_custom_target:
message( status|fatal_error, “message”):
set_target_properties( ... ): lots of properties... OUTPUT_NAME, VERSION, ....
link_libraries( lib1 lib2 ...): All targets link with the same set of libs
七、 说明
1,CMAKE生成的makefile能够处理好.h文件更改时只编译需要的cpp文件;
八、 FAQ
1) 怎样获得一个目录下的所有源文件
>> aux_source_directory(<dir> <variable>)
>> 将dir中所有源文件(不包括头文件)保存到变量variable中,然后可以add_executable (ss7gw ${variable})这样使用。
2) 怎样指定项目编译目标
>> project命令指定
3) 怎样添加动态库和静态库
>> target_link_libraries命令添加即可
4) 怎样在执行CMAKE时打印消息
>> message([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
>> 注意大小写
5) 怎样指定头文件与库文件路径
>> include_directories与link_directories
>>可以多次调用以设置多个路径
>> link_directories仅对其后面的targets起作用
6) 怎样区分debug、release版本
>>建立debug/release两目录,分别在其中执行cmake -DCMAKE_BUILD_TYPE=Debug(或Release),需要编译不同版本时进入不同目录执行make即可;
Debug版会使用参数-g;Release版使用-O3 –DNDEBUG
>> 另一种设置方法——例如DEBUG版设置编译参数DDEBUG
IF(DEBUG_mode)
add_definitions(-DDEBUG)
ENDIF()
在执行cmake时增加参数即可,例如cmake -D DEBUG_mode=ON
7) 怎样设置条件编译
例如debug版设置编译选项DEBUG,并且更改不应改变CMakelist.txt
>> 使用option command,eg:
option(DEBUG_mode "ON for debug or OFF for release" ON)
IF(DEBUG_mode)
add_definitions(-DDEBUG)
ENDIF()
>> 使其生效的方法:首先cmake生成makefile,然后make edit_cache编辑编译选项;Linux下会打开一个文本框,可以更改,该完后再make生成目标文件——emacs不支持make edit_cache;
>> 局限:这种方法不能直接设置生成的makefile,而是必须使用命令在make前设置参数;对于debug、release版本,相当于需要两个目录,分别先cmake一次,然后分别make edit_cache一次;
>> 期望的效果:在执行cmake时直接通过参数指定一个开关项,生成相应的makefile——可以这样做,例如cmake –DDEBUGVERSION=ON
8) 怎样添加编译宏定义
>> 使用add_definitions命令,见命令部分说明
9) 怎样添加编译依赖项
用于确保编译目标项目前依赖项必须先构建好
>>add_dependencies
10) 怎样指定目标文件目录
>> 建立一个新的目录,在该目录中执行cmake生成Makefile文件,这样编译结果会保存在该目录——类似
>> SET_TARGET_PROPERTIES(ss7gw PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${BIN_DIR}")
11) 很多文件夹,难道需要把每个文件夹编译成一个库文件?
>> 可以不在子目录中使用CMakeList.txt,直接在上层目录中指定子目录
12) 怎样设定依赖的cmake版本
>>cmake_minimum_required(VERSION 2.6)
13) 相对路径怎么指定
>> ${projectname_SOURCE_DIR}表示根源文件目录,${ projectname _BINARY_DIR}表示根二进制文件目录?
14) 怎样设置编译中间文件的目录
>> TBD
15) 怎样在IF语句中使用字串或数字比较
>>数字比较LESS、GREATER、EQUAL,字串比STRLESS、STRGREATER、STREQUAL,
>> Eg:
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
set(AAA abc)
IF(AAA STREQUAL abc)
message(STATUS "true") #应该打印true
ENDIF()
16) 更改h文件时是否只编译必须的cpp文件
>> 是
17) 机器上安装了VC7和VC8,CMAKE会自动搜索编译器,但是怎样指定某个版本?
>> TBD
18) 怎样根据OS指定编译选项
>> IF( APPLE ); IF( UNIX ); IF( WIN32 )
19) 能否自动执行某些编译前、后命令?
>> 可以,TBD
20) 怎样打印make的输出
make VERBOSE=1
参考文献:
[1] CMake_Tutorial.pdf
[2] CMake使用总结,http://blog.csdn.net/keensword007/archive/2008/07/16/2663235.aspx
[4] 安装包中文档
[5] Andrej Cedilnik,HOWTO: Cross-Platform Software Development Using CMake,October, 2003
[6] Cjacker,CMake实践.PDF