projects.txt

Clion使用Makefile方法 
---------------------
$>vi CMakeLists.txt
------------
cmake_minimum_required(VERSION 3.8)
project(PROG)                                                     #PROG(CLION创建工程时的名字.) 

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
set(PROG_SOURCE_DIR "~/$PATH")                                    #设定源码的路径.

message(${PROG_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})

add_custom_target(MAKE_PROG COMMAND make -j2 -C ${PROG_SOURCE_DIR} CLION_EXE_DIR=${PROJECT_BINARY_DIR} && cp ${PROG_SOURCE_DIR}/PATH/PROG ./)        #make -C Makefile && cp ${PROG_SOURCE_DIR}/PATH/PROG ${PROJECT_BINARY_DIR},将${PROG_SOURCE_DIR}/PATH/目录下的PROG可执行程序被拷贝到了${PROJECT_BINARY_DIR}目录中.  
或者
add_custom_target(MAKE_PROG COMMAND make -j2 -C ${PROG_SOURCE_DIR} CLION_EXE_DIR=${PROJECT_BINARY_DIR} && make -C ${PROG_SOURCE_DIR} install)        #make -C Makefile && make -C Makefile instal,这个比较适合开源软件.

$>ln -sf ${PROG_SOURCE_DIR} $PROG                                        #把源码以快捷的方式链接到工程的源代码目录,方便在调试过程中打断点. 
注意:"MAKE_PROG"这个是可以更改的,"${PROG_SOURCE_DIR}/PATH/PROG"这个是在Makefile文件中指定的路径来填写;"PROJECT_BINARY_DIR"系统默认会给定默认值,更改这个值没有意义.

修改clion-Keymap
---------------------
File->Settings->Keymap->Keymaps:Eclipse    #clion默认的Keymap并不支持回退操作,可以将其修改为其他类型;eg.Eclipse,Visual Studio等. 

eclipse工程创建(高手进阶)
---------------------
File->New->C/C++->C++ Project->Makefile project->Empty Project->Linux Gcc   #输入工程名称即可,创建此类工程适用于开源的项目的开发,内核开发以及自定义开发.

注意:
  1.如果是开源代码或svn/git/cvs代码导入工程的办法请参考"eclipse智能提示(2)"选择svn/git/cvs或者path(文件路径)即可,需要提示功能请参考"eclipse智能提示(1)".
  2.如果是内核开发请参考"eclipse智能提示(2)",然后选择选择svn/git/cvs或者path(文件路径)即可.

eclipse智能提示                                                                                                  -----还需include "xxx.h"才能智能提示函数的声明.
---------------------
1.鼠标放在函数上,alt+enter在打开的对话框"Paths and Symbols->includes"选择/usr/include或者其他路径,"Paths and Symbols->Symbols"这里设置的内容会打开/关闭用宏控制的代码块.      -----函数声明级别的提示.
2.如果是开发内核如要进行如下设置:
   xx-project->Propertics->Paths and Symbols->Source Location->Link Folder   #勾选"Link to folder in the file system",选择内核路径即可eg./usr/src/linux-source-3.2.            -----代码级别的提示.
   
eclipse代码分析
---------------------
xx-project->Propertics->C/C++ General->Code Analysis   #可以选择“Use workspace settings”/"Use project settings"

注意:
  1."Use workspace settings",使用在打开eclipse时选择workspace或者其他/path的配置,即使用的是“Window->Propertics->C/C++->Code Analysis”的配置.
  2."Use project settings",使用的是xx-project->Propertics->C/C++ General->Code Analysis的配置.
  3.如果打开的工程有大量报错信息的解决办法是"xx-project->Propertics->C/C++ General->Code Analysis"全部勾选掉.    -----针对每个工程的设置.
  4.如果打开的工程有大量报错信息的解决办法是"Window->Propertics->C/C++->Code Analysis"全部勾选掉.                -----针对整个workspace的设置.

cscope搜索
---------------------
$>cd /path
$>cscope -bqR              #建立查找数据库.
$>cscope -dq               #启动cscope,tab切换窗口[搜索结果/条件],方向键选择搜索条件/搜索结果;如果搜索结果内容过多;[Page Up/Page Down]/[CTRL+Left/Right]可以在搜索内容中进行翻页查看.     

Gdb远程调试
---------------------
$>gdbserver :$port --attach $pid    #:1234是端口号,$pid是进程ID.
or
$>cd /path/exec-dir                 #在目标主机中,进入可执行程序的目录.
$>gdbserver :1234 ./exec $args      #在目标主机中,指定执行程序并设置运行参数.
$>cd /path/exec-dir                 #进入可执行程序的目录.          
$>gdb                               #启动gdb.
------------
>target remote $ip:$port            #连接目标主机的gdbserver.
>set solib-absolute-prefix /path/   #设置GDB共享库查找路径前缀,这一步骤在调试嵌入式应用时用来设置交叉编译器的路径的(eg./mips-x68-linux).
>set solib-search-path /path/lib    #设置GDB共享库查找路径,这一步骤在调试嵌入式应用时用来设置交叉编译器共享库的搜索路径的(eg./mips-x68-linux/lib).
>symbol-file ./exec                 #加载exec-symbol.
>b x                                #断点.
>c                                  #继续执行.

注意:建立连接后,就可以进行调试了;跟gdb的调试方法相同,但是要用"c"来执行命令,不能用"r";因为程序已经在gdbserver启动了.

eclipse使用Gdb-server进行远程调试
---------------------
使用"GDB(DSF) Manual Remote Debugging Lancher",设置Debugger->Connection即可. 

clion优点
---------------------
1.方便调试,显示更直观.
2.CMakeLists.txt工程管理方式.

clion缺点
---------------------
1.代码的智能提示不能很好的工作.

/usr/bin/eclipse优点
---------------------
1.方便调试,功能与clion相媲美.
2.工程管理比较自由.
3.在开发C/C++时依然是首选则代码编辑器,拥有很强大的代码重构功能      -----重点. 

/usr/bin/eclipse缺点
---------------------
1.代码的智能提示不能很好的工作. 

阅读/研究代码的神器
---------------------
1.eclipse
2.cscope+vim

写代码神器
---------------------
1.eclipse

调试神器
---------------------
1.clion
2.eclipse

clion快捷键-常用操作
---------------------
ALT+1              #工程文件浏览器.
ALT+2              #打开Favorites窗口.
ALT+5              #在调试状态下,打开调试窗口.
ALT+6              #打开TODO对话框.
ALT+7              #打开结构浏览器.
ALT+0              #打开Build消息窗口.
ALT+Home           #切换到文件的导航栏(面包屑).
CTRL+e             #打开之前已打开文件的对话框.
CTRL+o             #打开Symbols(文件结构).
CTRL+l             #跳转到指定行号.
CTRL+/             #启用/禁用注释选择的代码段.
ALT+Down/Up        #快速将选择的代码段向上/向下移动.
CTRL+SHIFT+Down/Up #快速在当前文件检索上一个/下一个方法.

clion快捷键-标签
---------------------
SHIFT+F11          #显示Bookmarks窗口.
CTRL+SHIFT+F11     #启用或禁用Bookmarks,在源代码窗口的指定行使用CTRL+SHIFT+F11添加后删除标签.
CTRL+SHIFT+ALT+F11 #快速启用或禁用“数字Bookmarks(数字标记)”.

clion快捷键-调试
---------------------
CTRL+F11           #启动调试.

clion快捷键-代码折叠
---------------------
CTRL+[+/-]         #折叠或展开代码.

clion快捷键-文件关闭
---------------------
CTRL+F4            #关闭文件.
CTRL+SHIFT+F4      #关闭所有文件.

clion快捷键-综合设置
---------------------
ALT+v q 1          #快速选择颜色,Xcode带有放大效果就比较好.
ALT+v q 3          #快速选择快捷键.
ALT+v q 4          #快速选择窗口模式,可以多选.
ALT+v q 5          #快速选择窗口主题. 

开发工具链
---------------------
eclipse+clion+cscope   #eclipse写代码或调式代码,clion专门负责调试代码;cscope纯粹检索代码,cscope图形化的工具有Understand. 

build-essential
---------------------
$>cd /home/vsftpd/shared && cat usage.txt

GDB无法读取共享库中的全局变量"optind"解决办法
---------------------
选择[C++/Application] gdb,输入如下命令:
------------
$>p optind
$1 = 1

$>info var optind
All variables matching regular expression "optind":

File getopt.c:
int optind;

Non-debugging symbols:
0x0000000000666f60  optind@@GLIBC_2.2.5

$>p 'optind@@GLIBC_2.2.5'
$2 = 7

获取当前目录名
---------------------
$>basename $PWD
$>echo ${PWD##*/}
$>pwd | rev | awk -F \/ '{print $1}' | rev
$>pwd | sed 's,^\(.*/\)\?\([^/]*\),\2,'

Makefile循环
-------------------
#!/usr/bin/make

subdirs=...
all:
  @for s in $(subdirs);\
  do\
	  echo "s=$$s";\                       #显示SHELL变量.
  done

Makefile函数调用
-------------------
$(function_name args)
或者 
${function_name args}

eg.
$(subst <from>,<to>,<text>)

Makefile隐藏命令
-------------------
@                                              #隐藏命令.

eg.
-----
#!/usr/bin/make

all:
  @echo $$PATH                                 #SHELL中的变量需要"$$"来访问,SHELL中的变量.
  @date                                        #执行date命令.
  
Makefile定义SHELL变量
-------------------
variable_xx=$(shell ...)                       #Makefile变量.

all:
  @echo "variable_xx=$(variable_xx)"           #显示Makefile变量.
或者
variable_xx=$(shell ...)                       #Makefile变量.

all:
  @echo "variable_xx=${variable_xx}"           #显示Makefile变量.

通用Makefile
---------------------
CC=gcc

#TARGETS := $(shell basename $$PWD)
#TARGETS := $(shell pwd | sed 's,^\(.*/\)\?\([^/]*\),\2,')
#TARGETS := $(shell pwd | rev | awk -F \/ '{print $$1}' | rev).so
TARGETS := $(shell pwd | rev | awk -F \/ '{print $$1}' | rev)

objects = $(wildcard *.c)
files = $(notdir $(objects))
OBJS = $(patsubst %.c, %.o, $(files)) 

#CFLAGS=-I. `net-snmp-config --cflags`
CFLAGS=-I. -I/home/vsftpd/cxx/static/x11/include -I/home/vsftpd/cxx/static/boost/include -L/home/vsftpd/cxx/static/x11/lib -L/home/vsftpd/cxx/static/boost/lib -g -std=c++11 -Wl,-Bstatic
#BUILDLIBS=`net-snmp-config --libs`
BOOSTLIBS=-lboost_unit_test_framework -lboost_timer -lboost_system -lboost_test_exec_monitor -lboost_chrono
QTLIBS=-lQtCore -lQtDBus -lQtGui -lQtNetwork -lQtOpenGL -lQtScript -lQtScriptTools -lQtSql -lQtSvg -lQtTest -lQtUiTools -lQtXml -lQtXmlPatterns -lphonon -lQt3Support -lQtCLucene
#BUILDAGENTLIBS=`net-snmp-config --agent-libs`
#DLFLAGS=-g -fPIC -shared                                                              #动态库的标识.

all:$(OBJS)
	#$(CC) $(DLFLAGS) -o $(TARGETS).so $^  $(BUILDLIBS) $(BUILDAGENTLIBS)              #生成动态库.
	$(CC) -o $(TARGETS) $^  $(BOOSTLIBS) $(QTLIBS)
	
%.o:%.c
	$(CC) $(CFLAGS) -c  $^

.PHONY:clean
clean:
	rm $(OBJS) $(TARGETS)

通用Makefile
---------------------
CC=gcc

#TARGETS := $(shell basename $$PWD)
#TARGETS := $(shell pwd | sed 's,^\(.*/\)\?\([^/]*\),\2,')
#TARGETS := $(shell pwd | rev | awk -F \/ '{print $$1}' | rev).so
TARGETS := $(shell pwd | rev | awk -F \/ '{print $$1}' | rev)

objects = $(wildcard *.c)
files = $(notdir $(objects))
OBJS = $(patsubst %.c, %.o, $(files)) 

#CFLAGS=-I. `net-snmp-config --cflags`
CFLAGS=-I. -I/home/vsftpd/cxx/static/x11/include -I/home/vsftpd/cxx/static/boost/include -L/home/vsftpd/cxx/static/x11/lib -L/home/vsftpd/cxx/static/boost/lib -g -std=c++11 -Wl,-Bstatic
#BUILDLIBS=`net-snmp-config --libs`
BOOSTLIBS=-lboost_unit_test_framework -lboost_timer -lboost_system -lboost_test_exec_monitor -lboost_chrono
QTLIBS=-lQtCore -lQtDBus -lQtGui -lQtNetwork -lQtOpenGL -lQtScript -lQtScriptTools -lQtSql -lQtSvg -lQtTest -lQtUiTools -lQtXml -lQtXmlPatterns -lphonon -lQt3Support -lQtCLucene
#BUILDAGENTLIBS=`net-snmp-config --agent-libs`
#DLFLAGS=-g -fPIC -shared                                                              #动态库的标识.

all:$(OBJS)
	#$(CC) $(DLFLAGS) -o $(TARGETS).so $^  $(BUILDLIBS) $(BUILDAGENTLIBS)              #生成动态库.
	$(CC) -o $(TARGETS) $^  $(BOOSTLIBS) $(QTLIBS)
	
%.o:%.c
	$(CC) $(CFLAGS) -c  $^

.PHONY:clean
clean:
	rm $(OBJS) $(TARGETS)
	
注意:"$(wildcard *.c)"添加对应的目录即可编译此目录下的所有源文件,例如"$(wildcard *.c ./path/*.c ...)"它可以编译"/path/*.c"所有".c"的文件.

配置eclipse环境变量
---------------------
gcc
------------
$>cd /home/vsftpd/shared            #这里包含多个版本的gcc编译器.

x11-4.8.7 
------------
$>cd /home/vsftpd/cxx/static/x11                      #静态库目录.
$>cd /home/vsftpd/cxx/shared/x11                      #动态库目录.

使用静态库
------------
$>export PATH=/home/vsftpd/cxx/static/x11/bin:$PATH
$>cd src && qmake -project && vi xxxx.pro                               #进入QT代码目录执行"qmake -project ",并编辑.pro文件.
------------
TEMPLATE = app
TARGET = 
DEPENDPATH += .

#QMAKE_CXXFLAGS  设置编译选项
QMAKE_CXXFLAGS += -g -std=c++11 -Wl,-Bstatic             #设置编译选项. 

#INCLUDEPATH 设置头文件搜索位置.
INCLUDEPATH += . /home/vsftpd/cxx/static/x11/include /home/vsftpd/cxx/static/boost/include

#LIBS 设置库的搜索路径和链接库
LIBS += -L/home/vsftpd/cxx/static/x11/lib -L/home/vsftpd/cxx/static/boost/lib -lboost_unit_test_framework -lboost_timer -lboost_system -lboost_test_exec_monitor -lboost_chrono -lQtCore -lQtDBus -lQtGui -lQtMultimedia -lQtNetwork -lQtOpenGL -lQtScript -lQtScriptTools -lQtSql -lQtSvg -lQtTest -lQtUiTools -lQtXml -lQtXmlPatterns -lphonon -lQt3Support -lQtCLucene

#Input
SOURCES += tst.cc              #源文件列表
HEADERS +=                     #头文件列表
FORMS +=                       #UI文件列表

使用动态库
------------
$>export PATH=/home/vsftpd/cxx/shared/x11/bin:$PATH
$>cd src && qmake -project && vi xxxx.pro                               #进入QT代码目录执行"qmake -project ",并编辑.pro文件.
------------
TEMPLATE = app
TARGET = 
DEPENDPATH += .

#QMAKE_CXXFLAGS  设置编译选项
QMAKE_CXXFLAGS += -g -std=c++11 -Wl,-Bdynamic             #设置编译选项. 

#INCLUDEPATH 设置头文件搜索位置.
INCLUDEPATH += . /home/vsftpd/cxx/shared/x11/include /home/vsftpd/cxx/shared/boost/include

#LIBS 设置库的搜索路径和链接库
LIBS += -L/home/vsftpd/cxx/static/x11/lib -L/home/vsftpd/cxx/shared/boost/lib -lboost_unit_test_framework -lboost_timer -lboost_system -lboost_test_exec_monitor -lboost_chrono  -lQtCore -lQtDBus -lQtGui -lQtMultimedia -lQtNetwork -lQtOpenGL -lQtScript -lQtScriptTools -lQtSql -lQtSvg -lQtTest -lQtUiTools -lQtXml -lQtXmlPatterns -lphonon -lQt3Support -lQtCLucene

#Input
SOURCES += tst.cc              #源文件列表
HEADERS +=                     #头文件列表
FORMS +=                       #UI文件列表

boost
------------
$>cd /home/vsftpd/cxx/static/boost/                #静态库目录.
$>cd /home/vsftpd/cxx/shared/boost/                #动态库目录.
$>g++ -L /home/vsftpd/cxx/static/boost/lib -I/home/vsftpd/cxx/static/boost/include -Wl,-Bstatic -lboost_unit_test_framework -lboost_timer -lboost_system -lboost_test_exec_monitor -lboost_chrono 
$>g++ -L /home/vsftpd/cxx/shared/boost/lib -I/home/vsftpd/cxx/shared/boost/include -Wl,-Bdynamic -lboost_unit_test_framework -lboost_timer -lboost_system -lboost_test_exec_monitor -lboost_chrono 
or 
$>g++ -g -O0 -L /home/vsftpd/cxx/static/boost/lib -I/home/vsftpd/cxx/static/boost/include -lboost_timer -lboost_system -lboost_chrono  ...
$>g++ -g -O0 -L /home/vsftpd/cxx/shared/boost/lib -I/home/vsftpd/cxx/shared/boost/include -lboost_timer -lboost_system -lboost_chrono  ...  
$>ln -sf /lib/i386-linux-gnu/libgcc_s.so.1 /usr/lib/gcc/i486-linux-gnu/4.7.2/libgcc_s.so 

boost编译
------------
$>./bootstrap.sh --prefix=/home/vsftpd/cxx/shared/boost
$>./b2 --build-type=minimal --layout=system variant=release link=shared threading=multi runtime-link=shared
$>./b2 --build-type=minimal --layout=system variant=release link=shared threading=multi runtime-link=shared install

动态库:
eclipse 连接器需要使用以下参数:
-Wl,-Bstatic -lboost_unit_test_framework -lboost_timer -lboost_system -lboost_test_exec_monitor -lboost_chrono 
-Wl,-Bdynamic -lboost_unit_test_framework -lboost_timer -lboost_system -lboost_test_exec_monitor  -lboost_chrono   #因为编译出来的包含静态库和动态库而且同名.

静态库:
$>./bootstrap.sh --prefix=/home/vsftpd/cxx/static/boost 
$>./b2 variant=release link=static threading=multi install > build.log

x11-4.8.7编译
------------
$>cd /home/vsftpd/cxx/x11-4.8.7 && ./configure --static --debug-and-release --prefix=/home/vsftpd/cxx/static/x11      #静态库.
$>make && make install

$>cd /home/vsftpd/cxx/x11-4.8.7 && ./configure --shared --debug-and-release --prefix=/home/vsftpd/cxx/shared/x11      #动态库.
$>make && make install 

webStrom高亮选中的单词
------------
ALT+J                #选择相同的词. 
ALT+SHIFT+J          #取消选择.
ALT+SHIFT+CTRL+J     #选择全部相同. 
ALT+目标单词         #手动选择.

opengl
------------
$>vi opengl.c
------------
#include <GL/gl.h>
#include <GL/glut.h>

int main(int argc,char **argv)
{
  return 0;
}

$>gcc -g -O2 -fno-strict-aliasing -lGL -lGLU -lXmu -lXt -lSM -lICE -lXext -lX11 -lglut -lSDL -lpthread -lm -lrt opengl.c

配置eclipse函数智能提示
-------------------
$>cd /home/vsftpd/cxx/ && mkdir ctips cctips

linux
------------
$>ln -sv /usr/src/linux-source-3.2 /home/vsftpd/cxx/ctips/
$>ln -sv /usr/src/linux-source-3.2 /home/vsftpd/cxx/cctips/

boost
------------
$>ln -sv /home/vsftpd/boost_1_61_0 /home/vsftpd/cxx/cctips/

x11-4.8.7 
------------
$>ln -sv /home/vsftpd/x11-4.8.7 /home/vsftpd/cxx/cctips/

opengl
------------
目前还不能做到只能提示,只能强加练习加深记忆. 

eclipse设置Debugger
-------------------
Main->GDB command file:/path/.gdbinit           #填写.gdbinit路径.
eg.set logging file ~/gdb.txt                   #这条语句会在当前工程的目录下生成gdb.txt文件,gdb.txt记录了调试过程中的所有信息.

eclipse设置代码折叠
-------------------
Window->Preferences->C/C++->Editor->Folding     #启用相应的模块即可. 

OpenSSL库的使用实战指南
----------------------
$>openssl version -v                                                          #查看openssl版本.

OpenSSL编译
-----------
$>tar -xvf /home/vsftpd/openssl-1.0.2l.tar.gz
$>cd openssl-1.0.2l
$>./config -d --prefix=/usr/local/ --openssldir=/usr/local/ssl                #编译openssl静态库.
$>vi Makefile
-----------
CFLAG= -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -m64 -DL_ENDIAN -g -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
改成如下内容:
CFLAG= -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -m64 -DL_ENDIAN -O0 -fno-inline -gdwarf-2 -ggdb3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
$>make && make install

$>make clean
$>./config -d shared --prefix=/usr/local/ --openssldir=/usr/local/ssl         #编译openssl动态库.
$>vi Makefile
-----------
CFLAG= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -m64 -DL_ENDIAN -g -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
改成如下内容:
CFLAG= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -m64 -DL_ENDIAN -O0 -fno-inline -gdwarf-2 -ggdb3  -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
$>make && make install

私钥和证书
-----------
$>openssl genrsa -out privkey.pem 1024
$>openssl req -new -x509 -key privkey.pem -out ca_cert.pem -days 9999

Gdb远程调试共享库
-----------
$>gdbserver localhost:1234 $PROG $ARGS
$>ps -ef |grep -i $PROG
$>cat /proc/$PID/maps                                                         #查看libcrypto.so.1.0.0的代码在内存中的位置,由此可以知道libcrypto.so.1.0.0的代码在7ffff794a000~7ffff7dda000之间.
-----------
7ffff794a000-7ffff7bb3000 r-xp 00000000 fe:00 74723738                   /usr/local/lib/libcrypto.so.1.0.0
7ffff7bb3000-7ffff7db2000 ---p 00269000 fe:00 74723738                   /usr/local/lib/libcrypto.so.1.0.0
7ffff7db2000-7ffff7dda000 rw-p 00268000 fe:00 74723738                   /usr/local/lib/libcrypto.so.1.0.0

$>objdump -h /usr/local/lib/libcrypto.so.1.0.0 |grep .text                    #查看libcrypto.so.1.0.0的.text段在内存中的偏移地址,即00170ab0为偏移地址.
----------- 
11 .text         00170ab0  0000000000072d00  0000000000072d00  00072d00  2**8

$>nm /usr/local/lib/libcrypto.so.1.0.0 |grep -i $name                         #查看函数地址.
$>readelf -a /usr/local/lib/libcrypto.so.1.0.0 |grep -i $name                 #查看函数地址.

$>gdb                                                                         #运行gdb客户端.
$>symbol-file x_prog
$>target remote $srvip:1234
$>b main
$>add-symbol-file libcrypto.so.1.0.0 (7ffff794a000+00170ab0)                  #(7ffff794a000+00170ab0)这个是需要通过计算器计算的,回到gdb窗口,加载libcrypto.so.1.0.0的符号表;然后就可以在共享库的函数中设置断点啦.
$>b BIO_new

C/C++例子
-----------
$>cd Workspace
$>gcc -I /usr/local/include -O0 -fno-inline -gdwarf-2 -ggdb3 -DDEBUG -o x_prog x_prog.c -lcrypto -Wl,-rpath=/usr/local/lib/          #只有在指定了-rpath=/usr/local/lib/,gdb在调试的时候就能够够进入代码级调试;注意:-rpath必须是make install时的路径,否则在调试的时候不能进入代码.
$>vi x_prog.c
-----------
#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>

int main()
{
  BIO *b=NULL;
  int len=0;
  char *out=NULL;
  
  b=BIO_new(BIO_s_mem());
  
  if(NULL==b)
  {
    return 0;
  }
  
  len=BIO_write(b,"openssl",4);
  len=BIO_printf(b,"%s","zcp");
  len=BIO_ctrl_pending(b);
  
  out=(char *)OPENSSL_malloc(len);
  if(NULL==out)
  {
    return 0;
  }
  
  len=BIO_read(b,out,len);
  printf("out is:%s\n",out);
  
  OPENSSL_free(out);
  BIO_free(b);
  return 0;
}

注意:以上经过测试能够正常通过F5断点进入OpenSSL源代码.

在eclipse工程中浏览OpenSSL代码
-----------
Prj->Properties->C/C++ General->Code Analysis->Use project settings               #将Error部分全部去掉即可.
Prj->Properties->C/C++ General->Paths and Symbols->Source Location->Link Folder   #选择openssl-1.0.2l/crypto和openssl-1.0.2l/ssl目录.

工具使用经验
----------------------
/home/vsftpd/web/nginx-1.2.1/apt/mirror/ftp.us.debian.org/debian/pool/main/a/anjuta-extras    #anjuta-extras插件可以学习anjuta插件开发.
$>cd /home/vsftpd/web/nginx-1.2.1/apt/mirror/ftp.us.debian.org/debian/pool/main/a/anjuta-extras && dpkg -i anjuta-extras_3.4.0-1_amd64.deb   #安装扩展插件.
  1.scintilla          #很方便阅读代码,原始的GtkSourceView Editor不支持代码折叠;这个插件也有些问题,每次重新启动工程后折叠选项需要重新选择.
  2.scratchbox         #例子代码,演示方法(Edit->Preferences->General->Installed plugins 勾选Scratchbox即可进行测试.);这个例子主要演示了类似Symbol Database设置界面.
  3.sample1            #例子代码,演示方法(Edit->Preferences->General->Installed plugins 勾选Sample Plugin即可进行测试.);选中后会在anjuta的下部出现弹出面板"SamplePlugin".
比较好的办法的办法是去掉scratchbox,sample1;解压anjuta-extras_3.4.0-1_amd64.deb 将anjuta-editor.plugin,libanjuta-editor.so以及share目录下的所有内容都拷贝系统中.

$>cp anjuta-editor.plugin libanjuta-editor.so /usr/lib/anjuta
$>apt-get remove anjuta-extras

工程字体:12px.
F7       编译SRC,这个可以检查到代码中的错误.
F9       单个编译C源文件,不能很好的提示错误.
SHIFT+F7 编译整个工程,错误定位准确.

anjuta的git配置,有一个不好的地方是每添加一个文件就在Files中显示loading文件;最终决定还是不要在anjuta使用git的好.
-----------
$>git init
$>git config --global user.name Hy
$>git config --global user.email Anjuta@example.org
$>git config --global core.excludesfile ignore         #ignore排除的文件列表,参见ignore.zip.
$>git config --list                                    #查看配置.

anjuta的git替代方案是使用eclipse,编程时需要开启两个窗口;1.anjuta,2.eclipse.

eclipse:
  安装201106220900,的所有git软件,切换到git视图;eclipse neon的git也是极其优秀的,默认安装好了的.
  
Window->Preferences->Team->Git    #需要配置Cloning repositories,设置目录即可.

Eclipse 修改GIT提交时候的用户名和邮箱:
Anthor:   anjuta <anjuta@example.org>    #必须使用这种格式,否则会出错.
Committer:anjuta <anjuta@example.org>    #必须使用这种格式,否则会出错.

Eclipse Git创建步骤.
1.在GIT Eclipse:Window->Preferences->Team->Git                 #需要配置Cloning repositories,设置目录即可.
2.在GIT Eclipse:Window->Preferences->Team->Git->Configuration  #user.name:Hy user.email:Hy@example.org
3.Create new git.                                              #注意选择目录;配置的用户名与邮件如果在提交的时候不更该默认就是上面配置的信息,但可以更改但必须按照“Eclipse 修改GIT提交时候的用户名和邮箱”格式填写.
4.创建完GIT工程后,在该目录没有任何内容只有一个隐藏目录.git.         #这里需要注意的地方有:1.如果在这里添加文件然后提交:GIT服务器就会多出好多文件,如果要删除这些文件就会引发问题:1.>删除然后在change状态中添加删除信息的索引然后提交会导致工程为空,2.>忽略则保持原有状态.
5.切换到客户端
Protocal:ssh
Host:              #填写远程主机.
Repository path:   #填写在远程主机中创建GIT的全路经目录名即可.
URL:               #不用填写,在填写了HOST,Repository path之后这里会自动生成.
User:              #填写远程主机上已存在的用户名
Passworld:         #远程主机用户名的密码,然后勾选Store in Secure Store.
6.在本地创建完Git后,包含有remote和local.
local 可以创建和删除,local 创建可以指定remote分支;删除local不影响远程分支.
本地commit,内容不会到GIT服务器,push才会到Git服务器.
Git Staging->Commit and Push 按钮会同时提交到本地和服务器. 

实战
-----------
$>cd /path && mkdir xx
$>git init
$>git config --global user.name Hy
$>git config --global user.email hy@example.org
$>cd /path/xx && anjta->new project
$>eclipse 切换到git试图;工程准备完毕后需要提交一次,后面的操作创建分支;要操作指定分支只需要签出即可.

anjuta 配置外部工具:
Edit->Preferences->Tools
-----------
Name:                  在菜单上显示的名称
Short cut:             快捷键
Command:               命令,这里也可以配置脚本.
Parameters:            参数列表,这里可以使用Anjuta定义的系统变量.
Working directory:     工作目录,这里可以使用Anjuta定义系统变量.
Enabled:               该菜单是否生效(默认勾选)
Standard input:        标准输入(有就选没有就选NULL)
Standard output:       标准输出(Existing message pane-不重新开启新的panel.)
Standard error:        标准错误(Same as output)

eg.
-----------
Name:make test
Short cut:ALT+CTRL+P
Command:make                    
Parameters:test
Working directory:/home/hy/fcgi-demos   #配置当前make的工作目录,否则make test找不到target;这里可以使用Anjuta定义的系统变量.
Standard input:Current selection
Standard output:Existing message pane
Standard error:Same output

程序快捷键的定义:CTRL+ALT+...
配置完后的外部工具在:主菜单->Tools菜单项下面.
Usage:
$>Make target
$>gdb target
$>Make clean
$>gvim
$>cscope && ctags      #这里写成通用脚本配置在Anjuta外部工具即可.
$>kate
$>close                #关闭所有已经打开了的kate和gvim.

Anjuta 自定义的快捷键:
CTRL+ALT+k    #kate可更好的阅读代码,支持代码折叠和symbol.
CTRL+ALT+v    #gvim配合ctag+cscope可以很好的支持函数的跳转和搜索.
CTRL+ALT+c    #close打开的窗口可以使用这个快捷键批量关闭窗口,需要编写成shell进行管理;killall proc.
CTRL+ALT+b    #make target编译当前的目标.
CTRL+ALT+m    #ctag+cscope 生成代码信息,需要通过shell脚本进行管理.
CTRL+ALT+g    #搜索功能,缺陷只能搜索当前文件.

ctags 使用
-----------
$>ctags --list-languages          #查看ctags所支持语言
$>ctags --list-maps               #查看默认的对应语言的分析器
$>ctags --langmap=c++:+.inl –R    #添加映射,inl为扩展名的文件是C++文件.
$>ctags --list-kinds              #查看ctags可以识别的语法元素
$>ctags --list-kinds=c++          #单独查看可以识别的C++语法元素
$>ctags -R --c++-kinds=+px        #要求ctags记录C++文件中的声明,外部,前向声明.
$>ctags -R --fields=+aiKSz        #a-如果语法元素的类的成员的话,要标明其access(即是public的还是private的);i-如果有继承,标明父类;K-显示语法元素的类型的全称;S-如果是函数,标明函数的signature;z-在显示语法元素的类型是使用kind:type的格式.
$>ctags -R --extra=+f             #在tags文件中记录本次扫描的各个文件,一个文件名对应一个tag entry.
$>ctags -R --extra=+q             #某个语法元素是类的一个成员,当然ctags默认会给其记录一个tag entry;可以要求ctags对同一个语法元素再记一行.
$>ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=c++
$>ctags -R --languages=c++ --langmap=c++:+.inl -h +.inl --c++-kinds=+px --fields=+aiKSz --extra=+q --exclude=lex.xx.cc  
-R                                #递归
--languages=c++                   #只扫描文件内容判定为c++的文件(即ctags观察文件扩展名);如果扩展名对应c++,则扫描该文件.
--langmap=c++:+.inl               #告知ctags以inl为扩展名的文件是c++语言写的(即要求ctags以c++语法扫描以inl为扩展名的文件).
-h +.inl                          #告知ctags把以inl为扩展名的文件看作是头文件的一种(inl文件中放的是inline函数的定义,本来就是为了被include的);这样ctags在扫描inl文件时,就算里面有static的全局变量;ctags在记录时也不会标明说该变量是局限于本文件.
--exclude=lex.xx.cc               #告知ctags不要扫描名字是这样的文件.

$>:tag fn              #跳转到fn函数.
$>:stags tagname       #分割窗口.
$>:split               #水平分割窗口
$>:vspilt               #垂直分割窗口
$>:q                   #退出
$>:tselect tagname     #展示tagname选择列表.
$>:tag tagname_<TAB>   #如果名称太长可以使用TAB自动补全功能.
$>:TlistUpdate         #更新TList.
$>:tfirst              #第一个匹配
$>:tlast               #最后一个匹配
$>:tnext               #向后匹配
$>:[count]tprevious    #向前[count]个匹配
$>:[count]tnext        #向后[count]个匹配
$>:ptag tagname        #预览窗口中显示tagname标签.
$>:pclose              #关闭预览窗口
$>:pedit file.h        #在预览窗口中编辑文件file.h
$>:psearch atoi        #查找当前文件和任何包含文件中的单词并在预览窗口中显示.

CTRL+F2中快速打开cscope
-----------
gnome-terminal -x bash -c 'cd /path && cscope -bqR'
gnome-terminal -x bash -c 'cscope -dq' 

cscope 使用
-----------
$>:cs find {querytype} {name}
{querytype} 即相对应于实际的cscope行接口数字,同时也相对应于nvi命令:
0或者s                 #查找这个C符号
1或者g                 #查找这个定义
2或者d                 #查找被这个函数调用的函数(们)
3或者c                 #查找调用这个函数的函数(们)
4或者t                 #查找这个字符串
6或者e                 #查找这个egrep匹配模式
7或者f                 #查找这个文件
8或者i                 #查找#include这个文件的文件(们)

$>:cs help            #显示一个简短的摘要
$>:cs show            #显示cscope的链接
$>:cs reset           #重新初始化所有的cscope链接
$>:cs add cscope.out  #增加数据库
$>:cs kill {num|partial_name}  #杀掉一个cscope链接(或者杀掉所有的cscope链接);链接数字为-1,那么所有的cscope链接都会被杀掉.

注意:外部工具设置-快捷键,如果没有设置快捷键,第一次设置即刻生效;重复设置需重启Anjuta才能使用最后一次设置的快捷键,否则以第一次设置的快捷键为基准;Anjuta不支持函数跳转,间接可以使gvim来代替.

eclipse配置外部工具
---------------------
Run->External Tools->External Tools Configurations...                                                     #在打开的窗口中选择"Program"创建一个程序.
eg.Location:/usr/bin/gnome-terminal                                                                       #配置程序路径.
   Working Directory:${workspace_loc:/path}                                                               #每次打开终端时会自动进入Working Directory配置的目录.

注意:Working Directory的"${workspace_loc:/path}"相当重要.

eclipse使用GVIM打开源代码
---------------------
Window->Preferences->General->Editors->File Associations->Add                                             #添加*.c的关联程序选择GVIM,然后在源代码的右键Open with选择GVIM即可.

注意:创建一个GVIM菜单项,使用"alacarte"命令(或者ALT+F2输入"alacarte");然后创建一个GVIM的菜单项,GVIM位置"/usr/bin/gvim"(该菜单可以设置隐藏,但不能删除).

eclipse将当前编辑页面窗口最大化
---------------------
CTRL+M                #当前编辑页面窗口最大化 

eclipse高亮设置
---------------------
SHIFT+ALT+o                                                                                               #启用/禁用高亮选项.
C/C++->Editor->Mark Occurrences                                                                           #设置相关选项.
Window->Preferences->General->Editors->Annotations->Occurrences[or C/C++ Occurrences]                     #设置高亮的颜色.

eclipse高亮单词
---------------------
注意:纯c代码,移动光标到指定的单词点击一次就可以高亮;如果不能高亮可以参考"eclipse使用GVIM打开源代码"和“vi高亮源代码的单词”.

vi高亮源代码的单词
---------------------
SHIFT+[*/8]                                                 #向下查找并高亮.
SHIFT+[#/3]                                                 #向上查找并高亮.
'g'+'d'                                                     #高亮显示光标所属单词,‘n/SHIFT+n’查找.

注意:需要将光标移动到需要高亮的单词.

vi快速移动到文件开头
---------------------
gg

vi快速移动到文件末尾
---------------------
SHIFT+g            

vi显示总行数
---------------------
CTRL+g                                                      #显示总行数,以及阅读百分比.

vi快速移动到某行的开始
---------------------
n+G                                                         #数字(n).

vi快速翻页
---------------------
SHIFT+滚轮
SHIFT+b                                                     #向前翻页.
SHIFT+f                                                     #向后翻页.

vi相对于光标滚屏
---------------------
zt                                                          #将当前行移动到屏幕的开始.
zz                                                          #将当前行移动到屏幕的中央.
zb                                                          #将当前行移动到屏幕的结尾.

vi当前行移动
---------------------
0                                                           #数字(0),行首.
SHIFT+$                                                     #行末.
SHIFT+[^/6]                                                 #移动到当前行的一个非空格的字符;在看代码的时候的非常有用,代码的每行都是有<tab/space>开始的.
n+SHIFT+|[or\]                                              #移动到当前行的第n列.

vi文本块移动
---------------------
w/SHIFT+w                                                   #按单词向后移动并移动到下一个字符串的开始.
b/SHIFT+b                                                   #按单词向前移动并移动到上一个字符串的开始.
e/SHIFT+e                                                   #按单词向前移动并移动到下一个字符串的结尾,不忽略标点[eg.".",";"].

vi按行移动
---------------------
SHIFT+[=/+]                                                 #移动到下一行的首字符.
-                                                           #移动到上一行的首字符.

vi屏幕内移动
---------------------
SHIFT+H                                                     #屏幕的首行.
SHIFT+M                                                     #屏幕的中间行.
SHIFT+L                                                     #屏幕的行末.

vi刷新
---------------------
CTRL+l  

eclipse快速加入断点
---------------------
注意:鼠标放在需要调试的代码行,按下"CTRL+SHIFT+b"快速加入断点.

eclipse右边显示当前已打开的所有文件
---------------------
CTRL+e

eclipse在当前文件里显示当前打开的所有文件
---------------------
CTRL+F6

关闭当前文件
---------------------
CTRL+w

关闭所有文件
---------------------
CTRL+SHIFT+w

eclipse找出调用某个方法的所有源文件
---------------------
CTRL+SHIFT+g

eclipse视图切换
---------------------
CTRL+F7

eclipse在当前源文件中查找文本
---------------------
CTRL+k                           #向下查找.
CTRL+SHIFT+k                     #向上查找.

eclipse大小写切换
---------------------
CTRL+SHIFT+y                   #小写.
CTRL+SHIFT+x                   #大写.

注意:需要选中单词后才能生效.

eclipse根据"{"找到"}"
---------------------
CTRL+SHIFT+p

注意:鼠标首先应该停在"{"后面,然后按下"CTRL+SHIFT+p"才能生效.

eclipse从其他视图跳转到代码编辑器视图
---------------------
F12

eclipse进行全局/局部搜索
---------------------
CTRL+h

注意:C/C++ Search可以搜索到“text”,但如果有宏控制的源代码是搜索不到的("File Search"可以解决这个事情.).

eclipse创建工作集
---------------------
注意:操作方法是在"Project Explore"右边的"小三角"那里操作,"Top Level Elements"可以切换以工作集/工程的方式在"Project Explore"中显示工作状态;工作集熟练操作可以给工作带来很高的效率.

eclipse书签
---------------------
编辑框[鼠标加入断点的地方那个]->Add Bookmark          #编辑书签名称即可.
CTRL+##[Window-Show view->Other]                   #选择Bookmarks即可.

eclipse源代码编辑窗口显示辅助线帮助显示每行的字符个数
---------------------
Window->Preferences->General->Editors->Text Editors->Show print margin                                   #勾选,并设置个数字即可(eg.120/80).

eclipse跳转到指定行
---------------------
CTRL+l                                                                                                    #输入行号即可.

eclipse设置工作空间的字符编码
---------------------
Window->Preferences->General->Workspace                                                                   #选择Text file encoding:"Other:GBK/GB2312",New text file line delimiter:"Other:Windows".

注意:每次新建的工作空间都需要设置.

弥补Understand不足的地方(配置外部工具)
---------------------
Tools->User Tools->Configure...->New     #配置外部工具.
-----------
eg.Menu Text  :Gvim
   Command    :gvim
   Parameters :$CurFile
   
eg.Menu Text  :Kate
   Command    :kate
   Parameters :$CurFile
   
快速使用GVIM阅读代码
---------------------
F9                #打开Tlist.
CTRL+W            #切换窗口.
ALT+F4            #关闭窗口.

注意:Qt Creater中同样也可以配置这两个外部编辑器工具.

Idea开发Java-EE前的准备
---------------------
$>sudo rm -rf /etc/hosts
$>sudo cp -r /home/config/hosts /etc/

Idea开发Java-EE前的设置
---------------------
File->Projects Structure                                         #配置JDK,根据具体需求设置即可. 
Edit Configurations ... ->Run/Debug Configurations               #这里需要设置“Tomcat Server Setttings->Server->Application server”选择TomEE根路径即可.
Edit Configurations ... ->Run/Debug Configurations               #这里需要设置“Tomcat Server Setttings->Server->Open brower->After launch:Firefox”.
Edit Configurations ... ->Run/Debug Configurations               #这里需要设置“Tomcat Server Setttings->Server->HTTP port:8888”.

MakeFile 
---------------------
1.Makefile 打印变量:
    $(warning xxx)    #打印信息
    $(error xxx)      #打印信息
    $(warning $(xxx)) #输出打印变量的值.

    variable := value
    variable += more
    等同于
    variable :=value
    variable :=$(variable) more

    variable = value
    variable += more
    等同于
    temp = value 
    variable = $(temp) more

    $>make -p/--print-data-base  #打印信息

2.>Makefile变量特征
-------------------------
1.Makefile中变量和函数的展开(除规则命令行中的变量和函数以外),在make读取Makefile文件时进行的,这里的变量包括了使用"="定义和使用指示符"define"定义的.
2.变量可以用来代表一个文件名列表,编译选项列表,程序运行的选项参数列表,搜索源文件的目录列表,编译输出的目录列表等等.
3.变量名不能包括":","#","=",前置空白和尾空白的任何字符串.
4.变量名大小写敏感.推荐内部定义的一般变量使用小写方式(eg.目标文件列表objects),参数列表采用大写方式(eg.编译选项CFLAGS).
5.自动化变量"$<","$@","$?","$*"

2.>变量的引用
  Makefile中在对一些简单变量的引用,可以不使用"()"和"{}"来标记变量名,直接使用"$x"的格式来实现;这种用法仅限于变量名为单字符的情况(自动化变量也可以使用这种方式).对于一般对于一般多字符变量的引用必须使用括号,否则make将把变量名的首字母作为变量而不是整个字符串(eg.$PATH在Makefile中实际上是"$(P)ATH");这一点和shell中变量的引用方式不同.shell中的变量的引用可以是"${xx}"或者"$xx"格式,但在Makefile中多字符变量名的引用只能是"$(xx)"或者"${xx}"格式.

3.>变量的定义
  两种风格:递归展开式和直接展开式变量.递归展开式在引用的地方是严格的文本替换,直接展开式用:=定义;变量值中对其他变量或着函数的引用在定义变量时被展开(对变量进行替换),这种风格变量在定义时就完成了对所引用变量和函数的展开;因此不能实现对其后定义变量的引用.
  eg.CFLAGS := $(include_dirs) -0
     include_dirs := -Ifoo -Ibar
  由于变量"include_dirs"的定义出现在"CFLAGS"定义之后,因此在“CFLAGS”的定义中“include_dirs”的值为空.“CFLAGS”的值为"-0"而不是“-Ifoo _-Ibar -0”,这一点也是直接展开式和递归展开式变量的不同点.

  注意:1.在复杂的Makefile中,推荐使用直接展开式变量;因为这种风格的变量的使用方式和大多数编程语言中的变量使用方式基本相同.它可以使一个比较复杂的Makefile在一定程度上具有可预测性;而且这种变量允许我们利用之前所定义的值来重新定义它(比如使用某一个函数来对它以前的值进行处理并重新赋值),此方式在Makefile中经常用到.尽量避免和减少递归式变量的使用.
       2.当定义不包含尾空格的变量时,就不能使用这种方式;将变量定义和注释书写在同一行并使用若干空格分开.否则注释之前的空格会被作为变量值的一部分.
       eg.dir := /foo/bar #directory to put the frobs in   #变量"dir"的值是"/foo/bar"(后面<tab>),这可能并不是想要实现的;如果一个文件以它作为路径来表示“$(dir)/file”,那么就大错特错了.
4."?="操作符
  GNU make中,“?=”被称为条件赋值的赋值操作符,被称为条件赋值是因为“只有此变量在之前没有赋值的情况下才会对这个变量进行赋值”
  eg.FOO?=bar 
  等价
     ifeq($(origin FOO),undefined)
      FOO = bar
     endif
  含义:如果变量"FOO"在之前没有定义,就给他赋值"bar".否则不改变它的值.
  
5."+="操作符
  使用"+="操作符,相当于:
  objects = main.o foo.o bar.o utils.o
  objects :=$(objects) another.o
  
6.变量的替换引用
  对于一个已经定义的变量,可以使用“替换引用”将其值中的后缀字符(串)使用指定的字符(串)替换.
  eg.foo := a.o b.o c.o
     bar := $(foo:.o=.c)
   在这个定义中,变量"bar"的值就为“a.c b.c c.c”.使用变量的替换引用将变量"foo"以空格分开的值中的所有的字的尾字符"o"替换为"c";其他部分不变.
  eg.foo := a.o b.o c.o 
     bar := $(foo:%.o=%.c)
   在这个例子同样使变量"bar"的值为"a.c b.c c.c",这种格式的替换引用方式比第一种方式更通用.

使用环境变量-注意:
1.>在Makefile中对一个变量的定义或者以make命令行的形式对一个变量的定义;都将覆盖同名的环境变量(并不改变系统环境变量定义,被修改的环境变量只在make执行过程有效).而make使用"-e"参数时,Makefile和命令行定义的变量不会覆盖同名的环境,make将使用系统环境变量中这些变量的定义值.
2.>make的递归调用中,所有的系统环境变量会被传递给下一级make,默认情况下只有环境变量和通过命令行方式定义的变量才会被传递给子make进程.在Makefile中定义的普通变量需要传递给子make时需要使用"export"指示符来对它声明.
3.>一个比较特殊的环境变量"SHELL",在系统中这个环境变量的用途是用来指定用户和系统的交互接口,显然对于make是不合适的;因此make的执行环境变量"SHELL"没有使用同名的环境变量定义,而是"/bin/sh"。make默认“/bin/sh”作为它的命令行解释程序(make在执行之前将将变量"SHELL"设置为"/bin/sh").

Makefile调试
---------------------
$(info,"str")         #打印信息.
$(warning,"str")      #打印警告.
$(error,"str")        #打印错误信息,可以停止当前Makefile的执行.
$(error,$(CC))        #打印"CC"变量的值并停止当前的Makefile的执行.

@echo "str"
@echo $(CC)
注意:使用"echo"增加调试信息(echo只能在"target:"后面的语句中使用并且前面必须是<TAB>).

输出Makefile完整的命令
---------------------
make -n

Qt Create使用技巧
---------------------
ALT+0                    #打开/关闭侧边栏.
ALT+1/2/3/4              #Issues窗格/搜索结果窗格/应用输出窗格/编译输出窗格.
ALT+M                    #激活书签窗口.
ALT+X                    #激活项目窗口.
ALT+O                    #激活打开文档窗口.
ALT+U/SHIFT+ALT+U        #将选中的内容转换成小写/大写,修改默认的字符编码与文件一致即可使用该快捷键.
ALT+Y                    #激活文件系统窗口.
CTRL+TAB                 #快速切换已打开的文件.
CTRL+SHIFT+R             #将鼠标移动到需要更改的变量上,按下"CTRL+SHIFT+R"当变量名外框为红色时表示已激活全局修改功能;修改此处的变量名将一同修改代码中的所有使用该变量的变量名.
CTRL+M                   #添加/删除书签.
CTRL+./,                 #查找并移动到下/上一个书签.
CTRL+F                   #查找/替换当前选中的内容.
CTRL+I                   #自动缩进选中/当前行的代码.
CTRL+K                   #显示当前所有文件.
CTRL+L                   #跳转到某一行.
CTRL+W                   #关闭当前编辑的文件.
CTRL+Z                   #撤销.
CTRL+X                   #剪切.
CTRL+C                   #复制.
CTRL+V                   #粘贴.
CTRL+S                   #保存.
CTRL+P                   #打印.
CTRL+A                   #全选.
CTRL+O                   #打开文件/项目.
CTRL+N                   #新建文件/项目.
CTRL+U                   #选中{}包含的代码段.
CTRL+Q                   #退出.
CTRL+1/2/4/5/6/7         #切换到欢迎/编辑/调试/项目/分析/帮助等模式.
CTRL+[/]                 #跳到代码段的头部/尾部.
CTRL+SPACE               #自动补全.
CTRL+SHIFT+F             #在项目/文件夹下查找.
CTRL+SHIFT+U             #查找所有使用该符号的地方.
CTRL+SHIFT</>            #快速折叠/展开代码段.
CTRL+SHIFT+S             #保存所有文件.
CTRL+SHIFT+W             #关闭所有文件.
CTRL+SHIFT+T             #打开类型层次结构.
CTRL+SHIFT+F11           #全屏.
CTRL+SHIFT+[             #选中从当前行到代码段开始位置.
CTRL+SHIFT+UP/DOWN       #将当前行代码向上/下移动一行.
ALT+C,F                  #取得代码片段.
F2                       #快速切换到光标选中的对象的源码或定义.

设置Qt Create默认字符编码
---------------------
Tools->Options...->Text Editor->Behavior->File Encodings:GBK/UTF-8

Qt Create阅读和编写代码的工程文件(.pro)的设置.
---------------------  
INCLUDEPATH += /$PATH              #头文件包含路径.
HEADERS += /$PATH/*.h/.hpp         #工程中包含的头文件.
SOURCES += /$PATH/*c/.cpp/.cxx/.cc #工程中包含的源文件.

Qt Creater在".pro"文件中定义变量
---------------------
NAME = /PATH/...           #定义NAME变量.
HEADERS = $$NAME/...       #使用"$$"查询"NAME"变量.

注意:$PATH必须使用绝对路径. 
总结:eclipse小项目编码和调试比较强,但是遇到大项目编码就很不理想调试还是很不错的;Qt Create在大小项目的编写过程中拥有很强的快捷优势,强大的编写能力. 

cmake添加头文件
---------------------
include_directories(dir1 dir2 ...)

cmake添加链接库目录
---------------------
link_directories(dir1 dir2 ...)

相当于:LD_LIBRARY_PATH.

cmake查找库所在的目录
---------------------
find_library(RUNTIME_LIB rt /usr/lib /usr/local/lib ...)

cmake链接库文件
---------------------
link_libraries("/path/xx.a")
link_libraries(xx)
link_libraries($(RUNTIME_LIB))
link_libraries("/path/xx.so" "/path/yy.so" ...)

cmake设置要链接的库文件名称
---------------------
target_link_libraries(xx_projects rt xx yy)
target_link_libraries(xx_projects rt xx.a yy.a)        #显示指定链接静态库.
target_link_libraries(xx_projects rt xx.so yy.so)      #显示指定链接动态库.
target_link_libraries(xx_projects rt -lxx -lyy)

构建一个公共的代码目录
---------------------
$>mkdir -p /working && chmod -R 777 *        #clion的工程都创建在这个目录中.
$>mkdir -p /working/coding && chmod -R 777 * #用于存放"slickedit,sourceinsight"程序文件,"slickedit,sourceinsight"都添加这个目录文件即可.
$>mkdir -p /working/x && chmod -R 777 *      #用于存放"slickedit,sourceinsight"工程文件,工程文件只用创建一次即可,每次有程序文件更新,只需将程序文件拷贝到"/working/coding"即可.
or
$>mkdir -p /working/x /working/coding && chmod -R 4777 /working                 
$>vi /etc/samba/smb.conf
-----------
[working]
comment = "public"
path = /working
public = yes 
only guest = yes 
writeable = yes  
create mask = 2777 
directory mask = 2777 

clion与slickedit配合编辑
---------------------
修改"clion"拷贝文件路径的快捷键
-----------
File->Settings->Keymap->Main menu->Edit->Copy Paths:alt+n.

修改"clion"文件编码
-----------
File->Settings->File Encodings->IDE Encoding:GB18030.
File->Settings->File Encodings->Project Encoding:GB18030.
File->Settings->File Encodings->Properties Files:GB18030.
File->Settings->File Encodings->Transparent native-to-ascii conversion   #勾选,修改完后重新启动"clion".

修改"slickedit"文件编码
----------
Tools->Options->File Options->Load->Encoding                             #设置对应的文件编码格式即可,eg:UTF-8,GB2312,GB18030.

注意:clion对中文支持不好,可以用slickedit来弥补;需要将clion的编码和slickedit都设置为"UTF-8/GB2312/GB18030",选择GB18030能够很好的兼容Windows.

CC开发工具集合
---------------------
clion                #创建工程,快速执行编译与调试.
slickedit            #创建工程,友好地编辑和浏览代码.
sourceinsight        #创建工程,快速查找引用和symbol.

注意:clion,sourceinsight对中文支持不好,slickedit可以弥补他们的缺点;以上基本上是非常强大编辑代码的组合了.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡致云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值