又见炊烟升起

导航

=nsynote-编程

基本

//小端即低地址存低位字节。

//iaas,如果我去阿里云买一个服务器,然后自己装数据库、框架、docker 等等,整一个网站,那么我享受的是 Iaas 服务。

paas,如果我开发一个微信小程序,用腾讯云的 serverless 服务,小程序云作为后端,我无需再自己配置环境,直接运行函数即可,我享受的是 Pass 服务。

Sass,如果我开一个公司需要办公软件,我直接注册一个钉钉,文档、聊天、OA 等功能我直接可以用,完全不用自己开发,那么我享受的是 Sass 服务。
//vscode:
Visual Studio Code(VSCode)关闭右侧预览功能
==>搜索关键字 minimap

//github上单文件下载:git 上点开文件,在右上角有个 raw 按钮,右键另存为
// license关系:
image

//windows的版本:在cmd中执行ver命令
//代码Comment 中遇到的一些缩写,如
w/ with
w/o without
b/c because
LGTM Looks Good To Me
TGIF Thank God It's Friday

//CS和BS:
C = Client, S = Server。C/S 架构即“客户端-服务器” 架构。这里的“客户端”可以是有 GUI (图形用户界面)的定制软件,也可以是浏览器,甚至可以是通过 SSH 访问服务器的命令行脚本。只要是客户端通过访问服务器调取计算或者存储资源的,统统都是 C/S 架构。所谓的 Browser-Server 架构其实是 C/S 架构的一种特殊的实现形式,而不是其对立面。
事实上在国外 IT 业界从未听闻过把 C/S 和 B/S 对立起来的说法。国内可能是某些人对 Client 这个单词理解有误,以为它就是特指 GUI 软件。这其实是一个很大的误解。

作者:X Zhang
链接:https://www.zhihu.com/question/21803672/answer/70277374
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//亚马逊的云计算:
EC2,S3和IAM使用率最高,Amazon Web Services(AWS)的 Elastic Compute Cloud(EC2)是一个成功的例子。一个1.0-GHz x86 ISA 每小时的费用是 10 美分,追加一个单位或者实例在 2 到 5 分钟之内就能完成。亚马逊的可扩展存储服务(Scalable Storage Service,S3)的费用是每 GB 每月 12 美分到15 美分,数据通过互联网传入传出的带宽费用是每 GB10 美分到 15 美分。
image

//ccmake 与命令cmake 的不同之处在于ccmake 提供了一个图形化的操作界面.
CMake 中有一个变量CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo 和
MinSizeRel。当这个变量值为Debug 的时候,CMake 会使用变量CMAKE_CXX_FLAGS_DEBUG 和
CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成Makefile ,当这个变量值为Release 的时
候,工程会使用变量CMAKE_CXX_FLAGS_RELEASE 和CMAKE_C_FLAGS_RELEASE 选项生成
Makefile。
//po文件是GNU§ gettext项目的一套应用规范。属于L10n方案。“po”是: Portable Object(可跨平台对象)的缩写。
po与mo模式的转变过程
c源文件 ==> PO 模式 ==> MO 模式 ==> "文字!"
//一个开源的编辑po文件的程序,poedit。
//L10N是localization 的缩写形式,意即在l 和n 之间有10 个字母,本意是指软件的“本地化”。GNU gettext 是一个软件包,是为了使软件实现国际化支持而产生的。
可跨平台po文件可以转变为相应的机器码binary的格式文件:'mo' MO是Machine Object。
I18N是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软件的“国际化”.
I18N 和 L10N 的国际组织是 Openi18n 组织,其前身是 li18nux 组织。它原来是制定 GNU§/Linux 自由操作系统上软件全球化标准的国际计划,后来扩充到 GNU§/Linux 之外所有开放源代码的技术领域,因而更名为 Open Internationalization Initiative,由非营利组织 Free Standards Group 赞助,并为世界各大厂商所支持,对于 GNU§/Linux 系统上的多国语言文字处理技术和环境有决定性的影响。各个开源软件开发组织通常都有负责“国际化”和“本地化”工作的分支机构。
I18N 主要使用 gettext 软件包使软件实现国际化支持。事实上它是一整套 I18N 解决方案.
//po和mo文件的区别
//PO是Portable Object (可移植对象)的缩写形式;
MO是Machine Object (机器对象) 的缩写形式。
PO 文件是面向翻译人员的、提取于源代码的一种资源文件。当软件升级的时候,通过使用gettext 软件包处理PO 文件,可以在一定程度上使翻译成果得以继承,减轻翻译人员的负担。MO 文件是面向计算机的、由PO 文件通过gettext 软件包编译而成的二进制文件。程序通过读取MO 文件使自身的界面转换成用户使用的语言。
//PO文件是Portable Object文件的简称,它包含需要翻译的字符串。我们需要从源文件进行提取。
.pot(Portable Object Template),这是po的模板文件。在将来程序可能配置成其他语种,其他语言的po文件都从它而来。为了创建这文件,需要用到GNU gettext工具集中的xgettext。
.pot和.po这些文件都是文本文件,主要供翻译者使用。为了使程序在运行时能获取相关的翻译的内容,要进行所谓的编译过程,将文本文件转换为二进制文件.mo。这里用了gettext工具集中的另一程序msgfmt。
`

msgfmt --output=test.mo test.po

`
//建好的po文件里一个字符串也没有,要获得需要翻译的字符串有两个办法:一是从pot文件更新,只要下载到该源程序对应的pot文件(一般由官方提供),点类目->从pot文件更新即可。二是从源程序更新。这时要保证要翻译的源程序完整存放在选择的目录中,点类目->自源更新,POEdit会自动分析源程序,提取出字符串。POEdit会调用xgettext程序解析C/C++,Java,Perl,PHP,Python,TCL程序,调用dxgettext解析Delphi程序.

//下载了.pot 文件以后,请把它重命名为.po 文件。第一步是修改文件头
//po 文件的格式是一句msgid 跟着一句msgstr,以“#”开头的行是注释。您需要做的是把msgid 中的英文翻译成中文写到msgstr 中。
测试您的翻译的方法是:首先用msgfmt 命令把po 文件编译成mo 文件,然后把mo 文件复制到正确的locale 目录下,重新启动程序即可。locale 目录一般是:
/usr/share/locale/zh_CN/LC_MESSAGES/ 或者
/usr/locale/share/locale/zh_CN/LC_MESSAGES/
如果两者都不行,请在您软件的安装路径下找一找有没有相似的目录。通常一个po 文件只要通过编译,就没有语法错误了。另外,可以用msgfmt -cvv file.po 命令检查po 文件是否有格式错误;用msgfmt --statistics file.po 命令查看翻译统计信息。举个例子(输入文件为gimp.po,输出文件为gimp.mo):
msgfmt --statistics gimp.po -o gimp.mocp gimp.mo /usr/share/locale/zh_CN/LC_MESSAGES/gimp &
如果您的翻译没有正常地在程序中显示出来,可能是由于编码原因。请试试把您的po 文件中文件头的charset 改为UTF-8,再用下面提到的iconv§ 或msgconv§ 命令把文件转换成UTF-8 编码,然后重新生成mo 文件。

Android

//8.0简称o版本,9.0简称p版本,

git

create and switch to branch:

git checkout -b <branchname>

To get the list of changes between a given tag and the latest available version:

git log v2.6.30..master

List of changes with diff on a given file between two tags:

git log v2.6.29..v2.6.30 MAINTAINERS

With gitk

gitk v2.6.30..master

//日常同一套代码处理不同工作的流程:
1.在原始代码上创建不同的分支:

git checkout  bug_1
git checkout  bug_2

在bug_1 和bug_2上各自修改代码,每次切换分支都需要git commit保存。

如果修改半截子,又回来继续修改,因为前面已经git commit保存到History区了,需要执行

 git reset  HEAD^

恢复到working Directory区.

2.bug_1修改完成后,回到main分支,把bug_1的代码合并到main分支:

git merge bug_1

然后再提交代码
[以下有3A->4A和3B->4B 这2种办法提交代码]
3A.bug_1的代码提交后,再把main分支的修改回退到上一次修改,避免再合入bug_2时,因为bug_1导致的冲突
4A.bug_2修改完成后,回到main分支,把bug_2的代码合并到main分支:

git merge bug_2

或者
3B.bug_2修改完成后,回到main分支,把bug_2的代码合并到main分支:

git merge bug_2

此时因为前面已经合入了bug_1,有可能导致冲突,需要手工编辑文件消除冲突后,再git add 相关文件,再提交bug_2的修改

备注:在Git中,stash和commit都可以用来保存当前的工作进度,但是在不同仓库之间切换时,你应该使用commit而不是stash。

commit则可以将当前工作进度提交到当前仓库的本地分支,在切换到另一个仓库后,可以通过检出(checkout)相应的本地分支来继续之前的工作进度。

//Q:Git如何只克隆远程仓库最新的一个版本(不拷贝其他所有历史版本)?
A:我们可以在克隆时指定--depth 1,--depth后面的阿拉伯数字代表克隆仓库的最新几个版本,为1代表只克隆远程仓库的最新的一个版本。
示例:
git clone --depth 1 https://github.com/dogescript/xxxxxxx.git
1
注意:这样只会把默认分支clone下来,其他远程分支并不在本地,所以这种情况下,需要用如下方法拉取其他分支:

git remote set-branches origin 'remote_branch_name'
git fetch --depth 1 origin remote_branch_name
git checkout remote_branch_name
类似地,如果repo init 初始化,也可以使用 --depth 选项.

//Q:git clone下载代码,中途断掉怎么办?
A:
1)运行以下命令进行clone
$ git clone --recursive https:xxxxxx
2)进入项目根目录,继续下载
$ git submodule update --init --recursive
//git remote show 远端名称 ==>查询远程的git仓地址,是否相比本地仓有更新(末尾显示up to date 表示无更新;末尾显示local out of date 显示有更新)
nisy@sdc-uvdi132:/workspace/code1_g59/vendor/nxp-opensource/kernel_imx$ git branch -a
G59_A2_20210126
remotes/base/G59_A2_20210126
remotes/base/M18_Extra
remotes/base/auto_branch
remotes/base/dfmcG59
remotes/base/master
remotes/base/remote
remotes/m/G59_A2_20210126 -> base/G59_A2_20210126
nisy@sdc-uvdi132:/workspace/code1_g59/vendor/nxp-opensource/kernel_imx$ git remote show base

//其实 git 一开始也不用学太多指令,练习以下几个就够:

git init (初始一个 Repo)
git add [档案名称] (将某某档案加入版本控制)
git commit -m “储存讯息” (将这次要加入版本控制的档案,写入历史纪录)
git checkout -b “新分支名称” ( 如果要实作一个蛮巨大的实验性功能,我通常会开一个 branch)
git checkout “分支名称” ( 切换不同分支,注意先commit再切换,则不存在本地代码和文档被覆盖的问题)
git push (推送变更到远端做一次备份,通常是 Github)
git pull 拉下远端的变更

//Git 仓库模型大致分为三个工作区域,分别为工作目录(Working Directory),暂存区域(Stage 或 Index),以及本地仓库(History),相应的检入与检出命令如图 14 所示:
图 14. Git 三种状态之间的转换(1)
image

图 14. Git 三种状态之间的转换(1)
相关命令的简要说明如下:
git add files:把当前工作文件拷贝到暂存区域。
git commit:在暂存区域生成文件快照并提交到本地仓库。
git reset -- files:用来撤销最后一次 git add files,也可以用 git reset 撤销所有暂存区域文件。
git checkout -- files:把文件从暂存区域覆盖到工作目录,用来丢弃本地修改。

git restore --staged ... :从stage区撤销回工作目录,不丢弃本地修改

实际上,工作目录与仓库之间的复制也可以一步到位,如图 16 所示。
图 16. Git 三种状态之间的转换(2)

image

图 16. Git 三种状态之间的转换(2)
其中,git commit -a 等价于 git add 与 git commit,即先把文件从工作目录复制到暂存区,然后再从暂存区复制到仓库中。git checkout HEAD -- files 的过程刚好相反,即回滚到最后一次提交。
为了查看工作目录,暂存区域,以及本地仓库的文件有哪些不同,可以使用 git diff 命令,如图 17 所示:
图 17. Git 三种状态之间的比较
image

图 17. Git 三种状态之间的比较
git diff 命令相关的简要说明如下:
git diff:查看尚未暂存的文件更新了哪些部分。
git diff --cached:查看已暂存文件和上次提交时的快照之间的差异。
git diff HEAD:查看未暂存文件与最新提交文件快照的区别。
git diff :查看不同快照之间的区别。

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签实际上就是个指向特定提交对象的引用;而含附注标签实际上是存储在仓库中的一个独立 Git 对象。相比之下,含附注标签包含信息更多,包括自身校验信息,标签名字,Email,标签日期,以及标签说明等。含附注标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证,因此我们推荐使用含附注的标签,以便保留相关信息。

Git 提供了两种简单的补丁生成方案。一是使用 git diff 生成的标准补丁,二是使用 git format-patch 生成的 Git 专用补丁。这里,我们重点介绍第二种方式,关于第一种 git diff 方式,比较简单,这里不做介绍。

Visual_Basic_Application

//excel中切换到VB编辑器 Alt + F11
//VBS代码调试:、

  1. 打开命令行,更换目录到C:盘,执行下面这个命令:

Wscript.exe /X test.vbs

  1. 这个时候,应该会弹出一个Visual Studio对话框,提示你选择合适的调试器,直接点击上面的确定按钮就好了。

  2. 最后,你就可以跟调试C#或者C++程序一样,在 Visual Studio里面设置断点,查看变量的值了

bash

//bash脚本的调试可以通过打印值来调试,比如:

# 定义一个变量
my_variable="Hello, World!"

# 打印变量的内容
printf "%s\n" "$my_variable"
//bash调试方法:
printf "%s <<---1\n" "$log"
printf "%s <<---2\n" "$log"
printf "%s <<---3\n" "$log"

//每秒读取一次内容(读取的是一行字符串),保存成csv格式:

#! /bin/bash
while [ 1 ]
do
	sleep 1s
	str="\""$(date)"\",\\c"
	echo  -e ${str} >>222.csv
	str="\""$(cat ./temperature1)"\",\\c"
	echo  -e ${str} >>222.csv
	str="\""$(cat ./temperature2)"\""
	echo   ${str} >>222.csv
done

//比较数值大小:

-eq:等于
-ne:不等于
-gt:大于
-ge:大于或等于
-lt:小于
-le:小于或等于

//每秒读取一次内容(读取的是 多行字符串),保存成csv格式:

#! /bin/bash
while [ 1 ]
do
    sleep 1s
	str="\""$(date)"\""
	echo   ${str} >>333.csv
	
	# begin add next row
	echo ",\"" >>333.csv
	# append multiline result
	ps >>333.csv
	# end add next row
	echo "\"" >>333.csv
	
	# begin add next row
	echo ",\"" >>333.csv
	# append multiline result
	df -h >>333.csv
	# end add next row
	echo "\"" >>333.csv
	
	sed -i ":a;N;s/\"\n\,/\"\,/g;ta" ./333.csv
done

//bash中循环打印一组文件夹内容的案例:

mek_8q_raite:/ #for i in /sys/devices/virtual/thermal/thermal_zone* ; do echo $i ;echo type:$(cat $i/type); echo temp:$(cat $i/temp); echo trip_point_0_type:$(cat $i/trip_point_0_type); echo trip_point_0_hyst:$(cat $i/trip_point_0_hyst); echo trip_point_0_temp:$(cat $i/trip_point_0_temp); echo trip_point_1_type:$(cat $i/trip_point_1_type); echo trip_point_1_hyst:$(cat $i/trip_point_1_hyst); echo trip_point_1_temp:$(cat $i/trip_point_1_temp);echo; done

输出:

mek_8q_raite:/ #/sys/devices/virtual/thermal/thermal_zone0
type:cpu-thermal0
temp:46800
trip_point_0_type:passive
trip_point_0_hyst:2000
trip_point_0_temp:107000
trip_point_1_type:critical
trip_point_1_hyst:2000
trip_point_1_temp:127000

/sys/devices/virtual/thermal/thermal_zone1
type:cpu-thermal1
temp:47500
trip_point_0_type:passive
trip_point_0_hyst:2000
trip_point_0_temp:107000
trip_point_1_type:critical
trip_point_1_hyst:2000
trip_point_1_temp:127000

//makefile和shell脚本的语法差异:
makefile:

ifeq (xxx)
xxx
endif

shell:

if [xxx]
then
xxx
fi

//可以通过export命令将一个shell变量加入环境中
//对文件、字符串和数字使用t e s t 命令。
对数字和字符串使用e x p r 命令。
e x p r 命令测试和执行数值输出。使用最后退出状态命令$ ? 可测知t e s t 和e x p r ,二者均以0 表示正确,1 表示返回错误.
任何命令进行时都将返回一个退出状态。如果要观察其退出状态,使用最后状态命令:
$ echo $?

要退出当前进程,s h e l l 提供命令e x i t ,一般格式为:
exit n
其中,n 为一数字。
退出状态0 退出成功,无错误。
退出状态1 退出失败,某处有错误。
//shell执行选项-x 进入跟踪方式显示所执行的每一条命令用于调度

C

基本技巧

//拼接字符串时防止越界:

static ssize_t mtk_gpio_show_pin(struct device *dev,
	struct device_attribute *attr, char *buf)
{
	int len = 0;
	unsigned int bufLen = PAGE_SIZE;
	unsigned int i = 0;
......

	len += snprintf(buf+len, bufLen-len,
		"pins base: %d, pins count: %d\n", chip->base, chip->ngpio);        //消耗buf内存,所以同时记录消耗的数量len
	len += snprintf(buf+len, bufLen-len,
		"PIN: (MODE)(DIR)(DOUT)(DIN) -- (DRIVE) --(SMT)(IES)(PULL_EN)(PULL_SEL)(R1 R0)\n");      //消耗buf内存,所以同时记录消耗的数量len

	for (i = 0; i < chip->ngpio; i++) {
		if (len > (bufLen - 96)) {
			pr_debug("[pinctrl]err:%d exceed to max size %d\n",
				len, (bufLen - 96));
			break;
		}
		len += mtk_pctrl_show_one_pin(hw, i, buf + len, bufLen - len);   //消耗buf内存,所以同时记录消耗的数量len
	}

	return len;
}

//在原始文件中将制表符tab键 替换为 4个空格

sed -i 's/\t/    /g' input.txt

//打印出编译时间:
printf("-->0x%s %s\n",TIME, DATE);
//glibc和glib的区别:
libc=glibc=The GNU C Library (glibc),g指的是gnu.org组织,比如支持posix功能(包括 pthread.h等),目的是为不同平台的计算机提供c语言的lib支持,数据结构文件本身不多.
glib=gtk.org的,g指的是GTK,是GTK和GNOME的底层,有较多的数据结构包装
//方便快速比较2次采样的结果:
在C语言中,^是按位异或运算符。它可以用来将两个数的相应二进制位进行异或(XOR)操作:如果对应的二进制位不同,那么结果就是1;如果对应的二进制位相同,那么结果就是0。

//求教:Dev C++如何看内存中的值
https://zhidao.baidu.com/question/1835749599713802020
//注意:== 的优先级比 & 高,所以下面
if(0 == link_status &0x02)
需要改成
if(0 == (link_status &0x02))

#include "stdio.h"
void main()
{
    typedef unsigned char u8;
    int link_status = 0x0d;
    u8 reg_reset = 0x0f;
    if(0x0f != (link_status&0x0f))
    {
        if(0 == link_status &0x02)
        {
            reg_reset &=0xfd;
        }
    }
    printf("-->0x%x,0x%x,0x%x\n",reg_reset,(0 == (link_status &0x02)),(link_status &0x02));
}

//make 2>&1 | tee build.log
编译时将编译log写到build.log文件中,同时也输出到标准输出。

  • 成为一个开源软件程序员,需要走哪几步?
    代码编译和debug调测(gdb,bcc)
    irc沟通

1.编译代码
以wireshark为例,下载代码后,可以看到代码是以cmake来组织的,所以先cmake编译:
cmake ./CMakeLists.txt
如果有报错则搜索引擎查,直到生成了makefile文件,再输入
make
来编译。
编译完成后,找到编译的二进制文件,比如这里的 wireshark-2.6.3/run/wireshark 就是。
检查该文件是否有调试信息:
nisy@debian:/media/nisy/sda3_Win_program_HDD/_Technology/95_code/wireshark-2.6.3/wireshark-2.6.3/run$ file ./wireshark
./wireshark: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e11adf83f2d57bf9e5b40b6290667fa38f914f2d, not stripped

这里的not stripped即debug调试信息没有剥离,说明可以直接来调试这个程序。如果是stripped的,则需要检查cmake配置,重新编译,以达到生成的二进制包含了调试信息。

//Insight
http://mirage1993.blog.51cto.com/2709744/1693355
eclipse
nemiver为例子
https://linux.cn/article-5107-1.html

//有一个问题:如果一个文字被选择之后,发现变成白色,
打开代码文件后,不能CTRL+G跳转到某一行,需要鼠标拖动代码文件
看变量的窗口不能设置16进制或者10进制,ascii格式显示

//GCC 的“-E”选项可以让编译器在预处理阶段就结束,选项“-o”可以指定输出
的文件格式。
$ arm-linux-gnueabi-gcc -E test.c -o test.i

编译阶段主要是对预处理好的.i 文件进行编译,并生成汇编代码。
$ arm-linux-gnueabi-gcc -S test.i -o test.s
汇编阶段是将汇编文件转化成二进制文件,利用“-c”选项就可以生成二进制文件。
$ arm-linux-gnueabi-gcc -c test.s -o test.o
链接阶段会对编译好的二进制文件进行链接,这里会默认链接 C 语言标准库(libc)。

$ arm-linux-gnueabi-gcc test.o -o test
% ar cr libtest.a test1.o test2.o

上面命令中的cr选项通知ar创建这个存档文件
% gcc –shared –fPIC –o libtest.so test1.o test2.o
这里 –shared 选项通知链接器生成共享库,而不是生成普通的可执行文件。共享库文
件通常使用 .so 作为后缀名,这里 so 表示共享对象(shared object)。与静态库文件相同,
文件名以 lib 开头,表示这是一个程序库文件。

//gcc开启调试需要有-g选项,同时,不能有-s选项( -s Remove all symbol table and relocation information from the executable.).

//编译的程序运行完直接退出了,可以在
main()的return前加一个
scanf("%c");
等用户输入字符后再退出。

//image

//CMMI 安装, 即Configure、Make、Make Install
//gnome的编译环境 jhbuild ,jhbuild的缺省配置文件 : /usr/share/jhbuild/jhbuild/defaults.jhbuildrc
//位域:
定义:

struct data {
int a : 20; //位段a,占20位
unsigned char b : 3; //位段b,占3位,不会和a压缩存储
char : 0; //无名位段
unsigned char c : 5; //位段c,占5位
};
 
data test = {0};
test.b = 5

因为这里b定义为unsigned char b : 3;,所以再使用test.b时,取得的值是5;如果这里b定义的是 char b : 3,则test.b时,作为有符号来取,结果/test.b在输出时自动转化为整型,5(101)高位为1,扩展时高位连续补1,值为-3,注意这里的差异。

//如果定义了位域的范围较小,会造成了数据被丢失,如定义了 unsigned char c : 5; //位段c,占5位 ,但是给c赋值为63 (即0b 11 1111),则内存中仍然按照5bit存储,导致实际值为11111即31 。

//因为使用bsearch函数要求数组预先排好序,所以该函数通常和快速排序函数(qsort)一起使用,使用qsort()排序 并 用 bsearch()搜索是一个比较常用的组合,使用方便快捷。
//c99表示“1999年制定的标准”;c11表示“2011年制定的标准”,因此 c11 > c99

//gnu auto tool 工具链的使用:
image
image
image
image
image
image

//UNIX 上最原始的C 编译器叫CC(C Compiler C 编译器),源于此GNU 的C 编译器叫作GCC(GNU C Compiler),然而,随着GCC 支持语言的增加GCC 这个缩写的意义已演变成了GNU 编译器集合(GNU Compiler Collection),它是GNU 项目的一个产品,是个开放源代码软件。

//beep 的ASCII 码为07,所以你只要想辨法印出beep 字符,就会发出beep 声。如果你使用bash,作法为
echo $'\07'

如果你在编译个什么东西,请用下面指令
make ; echo $'\07'

这样shell会就在完成make 后,自动发出beep 声通知你。

//gcc的基本使用:
gcc -g -Wall program.c -o program
//emacs 启动gdb调试:M-x gdb
//程序的main函数可以通过参数argc和argv来访问程序的参数列表
int main (int argc, char* argv[])
程序退出代码是一个小整数值。一般的习惯是,返回0表示正常,而非0表示错误的出现。一些程序通过不同的非0值表示不同的错误情况。
//Mingwin(也称为Mingw、Mingw32 等)是MINimalist Gnu for WINdows(用于WINdows 的最低要求的Gnu)的简称,这个描述很适合它。Mingwin 是一个基于Windows 的开发套件,它大致可以和Visual C++ 或Borland 的Delphi 相比拟。与后两者不同的是,Mingwin 的区别在于它提供了在Windows 中类UNIX 的环境。由于它基于标准GNU 编译器gcc,所以Mingwin 还支持使用C++、Fortran 以及其它紧密相关的语言。它没有提供结构复杂的集成开发环境(IDE),而它们在Windows 开发环境中是很常见的。但是,Mingwin 拥有丰富的工具箱,其中包含健壮的实用程序,可以执行基本的开发操作:编译、链接等等。
//选项通常有两种格式:
短选项(short options )由一个短杠(hyphen)和一个字符(通常为一个大写或小
写字母)组成。短选项可以方便用户的输入。
长选项(long options )由两个短杠开始,之后跟随一个由大小写字母和短杠组成的
名字。长选项方便记忆和阅读(尤其在脚本中使用的时候)。
//在GNU Coding Standards (《GNU 编码标准》)中列举了一些常用的命令行选项的名称。
如果你准备提供与它们相似的选项,你应该选择使用编码标准中指定的名字。这样你的程序会与其它程序更相类似且更易于用户学习使用。在多数GNU/Linux 系统中,你可以通过输入以下命令阅读《GNU 编码标准》中关于命令行选项的指导方针:
% info “(standards)User Interfaces”
// 如何判断一个二进制中是否有符号表?使用file检查下文件的属性:

-rwxrwxr-x. 1 nisy nisy 11024 9月 11 19:53 hello_debug //-g参数生成的二进制
-rwxrwxr-x. 1 nisy nisy 8536 9月 11 19:53 hello_release_O //-O参数生成的二进制
-rwxrwxr-x. 1 nisy nisy 8536 9月 11 19:54 hello_release_O3 //-O3参数生成的二进制
-rwxrwxr-x. 1 nisy nisy 6264 9月 11 19:55 hello_release_strip //strip把hello_release_O3去掉符号表的二进制

[nisy@localhost src]$ file ./hello_debug
./hello_debug: ELF 64-bit LSB executable, java-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=2bf09e30ed2bc180b750b84222245233b515e1fa, not stripped
[nisy@localhost src]$ file ./hello_release_O
./hello_release_O: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=271573c4c9f0992b3f403a503a2cf0b79115f096, not stripped
[nisy@localhost src]$ file ./hello_release_O3
./hello_release_O3: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0afe6132d519e6e591ee5cb528db305c5075109d, not stripped
[nisy@localhost src]$ file ./hello_release_strip
./hello_release_strip: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0afe6132d519e6e591ee5cb528db305c5075109d, stripped
 
nisy@nisy:~/workspace/hello_world/src$ objdump -t ./hello_release_O3
 
./hello_O3: 文件格式 elf64-x86-64
 
SYMBOL TABLE:
0000000000400238 l d .interp 0000000000000000 .interp
0000000000400254 l d .note.ABI-tag 0000000000000000 .note.ABI-tag
0000000000400274 l d .note.gnu.build-id 0000000000000000 .note.gnu.build-id
0000000000400298 l d .gnu.hash 0000000000000000 .gnu.hash
 
 
nisy@nisy:~/workspace/hello_world/src$ objdump -t ./hello_release_strip
 
./hello_strip: 文件格式 elf64-x86-64
 
SYMBOL TABLE:
无符号
 
 
nisy@nisy:~/workspace/hello_world/src$ nm ./hello_release_strip
nm: ./hello_strip:无符号
nisy@nisy:~/workspace/hello_world/src$ nm ./hello_debug
0000000000601038 B __bss_start
0000000000601038 b completed.7585
0000000000601028 D __data_start
...

//gprof的使用方法主要以下三步:
会用-pg参数编译程序:g++ -o hello hello_grof.cpp -pg -g
运行程序,并正常退出,会在当前目录下生成gmon.out文件
使用gprof查看文件信息:
gprof -b ./hello gmon.out
可以使用运行命令:
gprof -b ./hello gmon.out | gprof2doc.py > ~WWW/hello.dot
生成dot格式的调用关系图文件,可以使用windows版的GVEdit for Graphviz软件查看调用关系图

//make 是一个命令工具,是一个解释makefile 中指令的命令工具,一般来说,大多数的IDE 都有这个命令,比如:Delphi 的make,Visual C++的nmake,Linux 下GNU 的make。可见,makefile 都成为了一种在工程方面的编译方法。
//makefile 的变量也就是一个字符串,理解成C语言中的宏可能会更好。
比如,我们声明一个变量,叫objects, OBJECTS, objs, OBJS, obj, 或是OBJ,反
正不管什么啦,只要能够表示obj 文件就行了。我们在makefile 一开始就这样定义:

objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

于是,我们就可以很方便地在我们的makefile 中以“$(objects)”的方式来使用这个变
量了,于是我们的改良版makefile 就变成下面这个样子:

objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)

//套接字socket = 计算机网络IP地址+ 该计算机的端口号(一个端口号一次只能分配给一个进程),对于linux程序员,socket的操作是对文件的操作。

套接字有很多种,但最常用的就是两种:
流式套接字(stream socket)和数据报套接字(Datagram socket)。在UnMx中,分别称之
为”SOCK_STREAM“和”SOCK_DGRAM”。
这两种套接字的区别在于它们使用不同的协议。我们说过,TCP/IP分为四层,每一
层都有多个协议。两种套接字使用的传输层的协议不同——流式套接字使用TCP协议(可靠连接),数据ifdef __cplusp报套接字使用的是UDP协议(不可靠连接)。

//Splint stands for Secure Programming Lint or Specifications Lint. Additional information about
Splint can be found online. The home site for Splint is located at:www.splint.org§
//splint的使用:
splint *.c
For the most C programs, this will produce a large number of warnings. To turn off reporting for
some of the warnings, try:
splint -weak *.c
//显示一个库文件是由那些c文件编译链接成的:

ar t libfofi.a FoFiBase.o FoFiEncodings.o FoFiIdentifier.o FoFiTrueType.o FoFiType1.o FoFiType1C.o

gdb

(gdb) attach xxxxx --- xxxxx为利用ps命令获得的子进程process id
(gdb) stop --- 这点很重要,你需要先暂停那个子进程,然后设置一些断点和一些Watch
(gdb) continue
如果需要暂停,直接按CTRL+C
(gdb) step ----单步调试

qtcreator

linux的列编辑器QtCreator是非常不错的IDE,最近在做的Qt命令行应用,因为调试的环境不同等问题,需要在调试的时候为 main() 传入参数。度娘了半天,没找到方法,只能自力更生。后来在“项目-构建和运行-运行”下找到了。

step 和next的区别:s= next line, stepping into function calls ;n =next line, stepping over function calls

ddd的调试 file->open program
[nisy@localhost The_art_of_debugging_cn_eng]$ insight ./insert_sort
X Error of failed request: BadLength (poly request too large or internal Xlib length error)
Major opcode of failed request: 138 (RENDER)
Minor opcode of failed request: 20 (RenderAddGlyphs)
Serial number of failed request: 6656
Current serial number in output stream: 6799
debug的用法:
原始启动后调试;程序运行时调试;core调试

ddd

//使用DDD 来attach process,需要先 ddd ./test1 把test1加载起来,再file->attach to process 来attach到某个process上,此时会暂停,然后可以continue和step来调试,注意如果按了run键,则是拉了一个新的test1来运行,不是原始的attach的process在运行。

C++

//visual studio 版本与vc版本的对应:
MSVC++ 5.0 _MSC_VER == 1100
MSVC++ 6.0 _MSC_VER == 1200
MSVC++ 7.0 _MSC_VER == 1300
MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio 2003)
MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005)
MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008)
MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)

//ctor - 传统c++中构造函数的缩写
//为了避免类对象的拷贝时出现问题(尤其是类对象有指针成员的时候),所以一个类必须要手工写其:
默认的拷贝构造函数
对= 做重载,避免使用=来赋值给类对象
如 StringBad & operator=(const StringBad &);
要有 析构函数 (尤其是类对象有指针成员的时候)

// default constructor 意指可以「不需任何自变量就被唤起」者。这样的一个constructor 如果不是没有任何参数,就是每个参数都有默认值。
//vector容器是C++中为内置数组提供的一种替代表示
//关于类似:

#ifdef __cplusplus
extern "C" {
#endif
 
extern int
abs( int /* val */ ) __attribute__((__const__));
 
extern long
labs( long /* val */ ) __attribute__((__const__));
 
#ifdef __cplusplus
} /* extern "C" */
#endif

中的解释:
1.
关于extern "C":
2.
In C++, string-literal is the name of a language. The language specifier "C++" is the default. "C" is the only other language specifier currently supported by Microsoft C/C++. This allows you to use functions or variables defined in a C module.

All of the standard include files use the extern "C" syntax to allow the run-time library functions to be used in C++ programs.
1.
关于#ifdef __cplusplus
2.
C++的环境变量.

//如何理解?

# if !defined(CYGBLD_ATTRIB_WEAK)
# define CYGBLD_ATTRIB_WEAK __attribute__ ((weak))
# endif

中的解释:

The keyword __attribute__ allows you to specify special attributes when making
a declaration. This keyword is followed by an attribute specification inside double
parentheses. The following attributes are currently defined for functions on all targets:
noreturn, returns_twice, noinline, always_inline, flatten, pure, const, nothrow,
sentinel, format, format_arg, no_instrument_function, section, constructor,
destructor, used, unused, deprecated, weak, malloc, alias, warn_unused_result,
nonnull and externally_visible. Several other attributes are defined for functions
on particular target systems. Other attributes, including section are supported for
variables declarations (see Section 5.31 [Variable Attributes], page 247) and for types (see
Section 5.32 [Type Attributes], page 252).

这里的“week”属性的含义是:

weak - The weak attribute causes the declaration to be emitted as a weak symbol
rather than a global. This is primarily useful in defining library functions which
can be overridden in user code, though it can also be used with non-function
declarations. Weak symbols are supported for ELF targets, and also for a.out
targets when using the GNU assembler and linker.

//有关“#pragma pack(pop)”的含义:
A “pragma” instructs the compiler to perform a particular action at compile time. Pragmas vary from compiler to compiler. For example, you can use the optimize pragma to set the optimizations to be performed on your program. The Microsoft C pragmas are:

alloc_text data_seg inline_recursion setlocale
auto_inline function intrinsic warning
check_stack hdrstop message
code_seg include_alias optimize
comment inline_depth pack
​​
When you use #pragma pack(n), where n is 1, 2, 4, 8, or 16, each structure member after the first is stored on the smaller member type or n-byte boundaries.

//关于template的定义:
早期:
template
inline T const& max (T const& a, T const& b)
{
// 如果a<b 就传回b,否则传回a
return a < b ? b : a;
}

晚期:
template
inline T const& max (T const& a, T const& b)
{
// 如果a<b 就传回b,否则传回a
return a < b ? b : a;
}
由于历史因素,你也可以使用关键字class 代替关键字typename 来定义一个type parameter。关键字typename 是C++ 发展晚期才引进的,在此之前只能经由关键字class 引入type parameter。关键字class 目前依然可用。但是这么写可能带来一些误导(让人误以为T 必须是class 型别),所以最好还是使用关键字typename。
//c++中struct和class的区别
关键词: c++中struct和clas
struct内数据默认是public类型的,
class内数据默认是private类型的。
这样的写法理解为struct的继承也没错:
struct WXDLLIMPEXP_BASE wxEventTableEntry : public wxEventTableEntryBase
{
wxEventTableEntry(const int& evType, int winid, int idLast,
wxObjectEventFunction fn, wxObject *data)
: wxEventTableEntryBase(winid, idLast, fn, data),
m_eventType(evType)

// the reference to event type: this allows us to not care about the
// (undefined) order in which the event table entries and the event types
// are initialized: initially the value of this reference might be
// invalid, but by the time it is used for the first time, all global
// objects will have been initialized (including the event type constants)
// and so it will have the correct value when it is needed
const int& m_eventType;

private:
wxEventTableEntry& operator=(const wxEventTableEntry&);
};

//There are two general kinds of containers:

Sequence containers are ordered collections in which every element has a certain position. This position depends on the time and place of the insertion, but it is independent of the value of the element. For example, if you put six elements into a collection by appending each element at the end of the actual collection, these elements are in the exact order in which you put them. The STL contains three predefined sequence container classes: vector, deque, and list.

Associative containers are sorted collections in which the actual position of an element depends on its value due to a certain sorting criterion. If you put six elements into a collection, their order depends only on their value. The order of insertion doesn't matter. The STL contains four predefined associative container classes: set, multiset, map, and multimap.

An associative container can be considered a special kind of sequence container because sorted collections are ordered according to a sorting criterion.

//STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类

组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:
<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、 <memory>、<numeric>、<queue>、<set>、<stack>和<utility>
算法部分主要由头文件组成。
是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。

体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。

中则定义了一些模板类,用以声明函数对象。
容器部分主要由头文件,,,,,组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。

向量(vector) 连续存储的元素
列表(list) 由节点组成的双向链表,每个结点包含着一个元素
双队列(deque) 连续存储的指向不同元素的指针所组成的数组
集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序
多重集合(multiset) 允许存在两个次序相等的元素的集合
栈(stack) 后进先出的值的排列
队列(queue) 先进先出的执的排列
优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列
映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列
多重映射(multimap) 允许键对有相等的次序的映射
迭代器部分主要由头文件,组成。
是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,
中提供了迭代器使用的许多方法,而对于的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。

QT

//qml 是解释型语言,C++ 是编译型语言,运行效率先天决定在这
qwidget 无法实现或困难实现的 ,qml 都能做到甚至可以更华丽,同时qwidget开发难度更高。在桌面端或者对界面要求高且性能足够的嵌入式场景使用 qml 未尝不可,但嵌入式环境 qwidget 往往能满足大部分需求同时资源开销小。
//使用qmake 编译项目时,编译套件中的其他工具自动会提供Qt 的所有增强功能:
moc将处理头文件以启用信号和槽;rcc 将编译指定的资源;而uic
则可用来根据用户界面创建代码。
//.qrc(即:Qt Resource Collection,Qt 资源收藏)文件中列出了与应用程序一起打包的资源,包括构建目录中的文件列表以及该应用程序中所使用的资源路径。这些文件是使用rcc 来处理的,以便创建要编译至应用程序的数据。使用这一方法,可以确保应用程序始终可以访问某些关键资源,避免出现分发问题和安装问题。

//Qt/Embedded是成熟可靠的工具开发包,它在世界各地被广泛使用。除了在商业上的许
多应用以外,Qt/Embedded还是为小型设备提供的Qtopia应用环境的基础。
Trolltech 提供三大Qtopia 版本:Qtopia 手机版、Qtopia PDA 版和Qtopia 消费电子产品
平台:
Qtopia 手机版:Trolltech 面向嵌入式Linux 的Qtopia 手机版(Qtopia Phone) 是Qtopia的一
个自定义版本用于内存有限的智能手机和功能手机它的用户界面可自定义内存占用量低手机
制造商使用它可以创建令人赞叹的图形用户界面从而令手机卓越超群Qtopia 手机版有两个
版本键盘驱动和手写笔驱动。
Qtopia PDA 版:Qtopia PDA 版Qtopia PDA 是一个强大的平台专用于基于Linux操作系统
的PDA 个人数字助理设备许多PDA 都已采用了Qtopia,Qtopia PDA 版已经成了事实上的
Linux 标准它代表了可行的第三种PDA 设计方案Qtopia PDA 版具有可定制的用户界面支持
多种不同的屏幕尺寸以及横向和纵向布局。
Qtopia 消费电子产品平台:While Qtopia 手机版和Qtopia PDA 版是针对移动电话和
PDA 制造商的统包解决方案而Qtopia 消费电子产品平台(Qtopia CEP) 则是一套高层次开发
平台适用于那些希望自行设计和开发应用套件的制造商Qtopia CEP使得制造商能够在形形色
色的手写笔和键盘驱动的设备上创建自定义的环境这些设备包括电视机Web Pad 无线联网板
机顶盒以及许多其它基于Linux 的设备等等。
//Q_OBJECT是一个宏定义,如果类里面用到了signal或者slots,就要声明这个宏。
//信号和槽函数必须有着相同的参数类型,这样信号和槽函数才能成功连接
//使用Qt Designer设计的文件如gotocelldialog.ui文件,在用qmake命令,会自动调用uic(Qt的用户界面编译器),uic工具把gotocelldialog.ui转换成c++代码,保存在ui_gotocelldialog.h中。
//当一个槽函数由信号引发时它的返回值被忽略,但是如果槽函数做为普通函数调用,这个返回值就可以象其他普通函数一样被得到。
// Qt支持多种格式的图片文件,包括BMP, GIF, JPEG, PNG, PNM, XBM, XPM…
// GUI程序通常会使用很多图片。提供图片的方式很多,主要有:
1、 把图片存储在文件中,程序运行时加载它们
2、 在源代码中包含XPM文件(这种文件是有效的c++文件)
3、 使用Qt提供的资源管理方案。
//The uic reads an XML format user interface definition (.ui) file as generated by Qt Designer§ and creates a corresponding C++ header file.
Usage:
uic [options]
The following table lists the command-line options recognized by uic.

Option Description
-o Write output to instead of to standard output.
-tr Use for translating strings instead of tr().
-p Don't generate guards against multiple inclusion (#ifndef FOO_H ...).
-h Display the usage and the list of options.
-v Display uic's version number.
​​

//使用qmake 编译项目时,编译套件中的其他工具自动会提供Qt 的所有增强功能:
moc将处理头文件以启用信号和槽;rcc 将编译指定的资源;而uic
则可用来根据用户界面创建代码。
//QDesigner存盘会生成一个扩展名为”ui”的文件,你接下来的任务就是把它解析成cpp和h文件,假设文件名为myform.ui,解析方法如下:

$uic myform.ui –I myform.h –o myform..cpp //这句生成cpp文件
$uic myform.ui –o myform.h //这句生成h文件.
//由pro文件生成Makefile.
对于Linux/Unix程序员来说编写Makefile文件是一项令人烦恼的任务,而qt程序员就没有这样的烦恼,一句$qmake –o Makefile myprogram.pro就可以轻松愉快的完成任务.

//Makefile像这样由".pro"文件生成makefile:
qmake -o Makefile hello.pro

// qmake的高级技巧(具体的qmake的一些关键字的信息可以参考Trolltech的” qmake Manual”):
项目文件示例:

SOURCES += myqt.cpp
SOURCES += main.cpp
HEADERS += myqt.h
FORMS += xsimform.ui
TEMPLATE = lib
CONFIG += debug \
warn_on \
qt \
thread \
x11 \
plugin
TARGET = ../bin/panel_qt
INCLUDEPATH = ../../../../xsim \
../../../../xsim/IMdkit
DEFINES = BDB_VERSION4 \
OS_LINUX

从这个文件可以知道,SOURCES变量指向项目中的源文件,当项目中有多个源文件时,我们需对项目中的每一个源文件都这样做,直到结束:
SOURCES += hello.cpp
SOURCES += main.cpp
当然,如果你喜欢使用像Make一样风格的语法,你也可以写成这样,一行写一个源文件,并用反斜线结尾,然后再起新的一行:
SOURCES = hello.cpp
main.cpp
HEADERS变量指向项目中的头文件,多个头文件的时候,和多个源文件的解决方法一致。
FORMS变量指向项目中使用到的窗体文件(qtdesign设计的.ui文件),qmake也注意了Qt的特殊需求,可以自动的包含moc和uic的连编规则。没有的话或者非qt程序可以不写。

TEMPLATE变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:
app - 建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
lib – 建立一个链接库的makefile。
subdirs – 在父目录和子目录都create makefile
vcapp - 建立一个应用程序的Visual Studio项目文件。
vclib - 建立一个库的Visual Studio项目文件。
subdirs -
这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的mkefile。
CONFIG变量指定了编译器所要使用的选项和所需要被连接的库。配置变量中可以添加任何东西,但只有下面这些选项可以被qmake识别。
下面这些选项控制着使用哪些编译器标志:
release - 应用程序将以release模式连编。如果"debug"被指定,它将被忽略。
debug - 应用程序将以debug模式连编。
warn_on - 编译器会输出尽可能多的警告信息。如果"warn_off"被指定,它将被忽略。
warn_off - 编译器会输出尽可能少的警告信息。
下面这些选项定义了所要连编的库/应用程序的类型:
qt - 应用程序是一个Qt应用程序,并且Qt库将会被连接。
thread - 应用程序是一个多线程应用程序。
x11 - 应用程序是一个X11应用程序或库。
windows - 只用于"app"模板:应用程序是一个Windows下的窗口应用程序。
console - 只用于"app"模板:应用程序是一个Windows下的控制台应用程序。
dll - 只用于"lib"模板:库是一个共享库(dll)。
staticlib - 只用于"lib"模板:库是一个静态库。
plugin - 只用于"lib"模板:库是一个插件,这将会使dll选项生效。
TARGET变量指定生成的二进制代码的路径和文件名,如果建立的是一个链接库的话,它会在文件名前面自动加上"lib"和在最后自动加上".so".
我们在使用过程中可能会使用到另外的一些函数库,链接库等。函数库的头文件指定使用INCLUDEPATH变量,其它链接库的指定可以通过LIBS
变量来指定,例LIBS += -lmath -L/usr/local/lib
DEFINES变量的指定就如同make的-D选项一样。

// GNUPro Developers Kit includes:
GCC—the highly optimized ANSI-C compiler.
G++—ANSI-tracking C++ compiler.
GDB—source- and assembly-level debugger.
GAS—GNU assembler.
LD—GNU linker.
Cygwin—UNIX environment for Windows.
Insight—a graphical user interface (GUI) for GDB.
Source-Navigator—source code comprehension tool.

//qt的代码如何编译:
1.使用qmake –project 产生.pro文件
2.使用qmake产生debug文件夹和release文件夹,以及makefile文件
3.使用make来编译代码

GTK

//gtkmm 是流行的图形界面库 GTK+的官方 C++ 接口。
//The GNU C Library project (glibc) 是GNU组织的,provides the core libraries for the GNU system and GNU/Linux systems, as well as many other systems that use Linux as the kernel. These libraries provide critical APIs including ISO C11, POSIX.1-2008, BSD, OS-specific APIs and more. These APIs include such foundational facilities as open, read, write, malloc, printf, getaddrinfo, dlopen, pthread_create, crypt, login, exit and more.

The GNU C Library is the standard system C library for all GNU systems,
and is an important part of what makes up a GNU system. It provides the
system API for all programs written in C and C-compatible languages such
as C++ and Objective C; the runtime facilities of other programming
languages use the C library to access the underlying operating system.

In GNU/Linux systems, the C library works with the Linux kernel to
implement the operating system behavior seen by user applications.

//GLib 是gnome组织的, is the low-level core library that forms the basis for projects such as GTK+ and GNOME. It provides data structure handling for C, portability wrappers, and interfaces for such runtime functionality as an event loop, threads, dynamic loading, and an object system.

wxwidget

//wxFormBuilder only supports sizer based layouts, so you will have to add a sizer to be able to insert controls. Go to the Component Palette and click on the Layout tab. Then, create a box sizer by clicking on the first icon.
image

//有关XRC文件:
wxPython中定义用户界面布局可以采用两种方法。传统的方法是将界面布局代码直接写在源文件之中,这种方法不需要学习XML语法,概念上较为简单,避免了同时维护多个文件的麻烦;同时,对IDE的自动完成的支持较好。另一种方法则是采用XML资源文件,即XRC(XML Resource)。XRC的基本出发点是界面布局和程序逻辑的分离,即将界面布局代码采用XML的方式放在分离的文件之中;在程序中不涉及控件的创建和布局,只需要加载相应的资源并处理事件绑定即可。在wxPython中采用XRC分离界面布局和程序逻辑主要有以下几个方面的好处:
提高了程序的可维护性
界面布局可由专业人员设计
更好的支持GUI布局设计工具
作为wxWidgets的规范,XRC资源可通用于C++、Python等语言

//读代码的分析:
<wxTest.cpp>

#include "wxTest.h"
#include "wxTestFrame.h"
 
IMPLEMENT_APP( MyApp );
 
bool MyApp::OnInit()
{
wxTestFrame* frame = new wxTestFrame();
frame->SetIcon( wxICON( amain ) );
frame->Show();
return true;
}

//程序启动的入口是MyApp::OnInit()的原因:
IMPLEMENT_APP( MyApp ); 中,指定了MyApp做为应用程序的类,必须是从wxApp继承的类。
//event table的使用:
Event table的声明:
<wxTestFrame.h >

#ifndef WXTESTFRAME_H
#define WXTESTFRAME_H
 
#include "wxTest_GUI.h"
 
class wxTestFrame : public MainFrame
{
public:
wxTestFrame( wxWindow *parent = NULL, int id = -1 );
~wxTestFrame();
private:
void OnExit( wxCommandEvent& event );
void OnAbout( wxCommandEvent& event );
DECLARE_EVENT_TABLE();
};
#endif // WXTESTFRAME_H

分析:

#define DECLARE_EVENT_TABLE() \
private: \
static const wxEventTableEntry sm_eventTableEntries[]; \
protected: \
static const wxEventTable sm_eventTable; \
virtual const wxEventTable* GetEventTable() const; \
static wxEventHashTable sm_eventHashTable; \
virtual wxEventHashTable& GetEventHashTable() const;

Event table的使用:

BEGIN_EVENT_TABLE( wxTestFrame, MainFrame )
EVT_MENU( ID_FILE_EXIT, wxTestFrame::OnExit )
EVT_MENU( ID_HELP_ABOUT, wxTestFrame::OnAbout )
END_EVENT_TABLE()

分析:相关文件:event.h / event.cpp

#define BEGIN_EVENT_TABLE(theClass, baseClass) \
const wxEventTable theClass::sm_eventTable = \
{ &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \
const wxEventTable *theClass::GetEventTable() const \
{ return &theClass::sm_eventTable; } \
wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \
wxEventHashTable &theClass::GetEventHashTable() const \
{ return theClass::sm_eventHashTable; } \
const wxEventTableEntry theClass::sm_eventTableEntries[] = { \

//visual c++ express 的wxwidget插件生成的默认wxwidget工程分析:

wxTest
|__ res
|__ wxTest.ico
 
wxTest\fileversion.cpp
wxTest\fileversion.h
 
wxTest\wxTest.cpp
wxTest\wxTest.h
 
wxTest\wxTest.rc
 
wxTest\wxTest_GUI.cpp
wxTest\wxTest_GUI.h
 
wxTest\wxTestAbout.cpp
wxTest\wxTestAbout.h
 
wxTest\wxTestFrame.cpp
wxTest\wxTestFrame.h
 
wxTest\wxTestPanel.cpp
wxTest\wxTestPanel.h

wxTest.fbp
//wxwidget中几个特定的宏:

DECLARE_APP
DECLARE_EVENT_TABLE

IDE vscode

//vscode调试c代码可以参考:
https://blog.csdn.net/whahu1989/article/details/124509095

类似我的使用 _3 文件夹倪调试代码,配置如下:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug",
            "type": "gdb",
            "request": "launch",
            "target": "./build/_3.exe",
            "cwd": "${workspaceRoot}",
            "valuesFormatting": "parseText"
            "stopAtEntry": true
            "windows": {
                "MIMode": "gdb",
                "miDebuggerPath": "gdb.exe",
                "program": "${workspaceFolder}/build/_3.exe"
            },
        }
    ]
}

为了打开-g参数,需要增加2条 -g 的配置:

....
include(CTest)
enable_testing()

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g") 

add_executable(_3 main.c)
...

jAVA

//微软为 Java 开发者推出 VSCode 安装程序,即 Visual Studio Code Java Pack Installer。
//OpenJDK 是 Java 平台标准版(Java SE)的免费开源版本。目前 Java 8 仍然是使用最广泛的 Java 版本,而 Java 11 是 Java 的第一个长期支持(long-term support,即 LTS)版本。
//OpenJDK是Java的开源版本,主要开发于Oracle,将成为Java的标准实现并已包含于Ubuntu中。

JAVA的版本最开始是1995年的JDK Alpha and Beta版本,第二年发布JDK1.0版本之后就是JDK1.1,JDK1.2。到1998年,不再叫JDK了,而是叫J2SE,但是版本号还是继续延续下去。到了2004年,Sun公司又各种不爽了,按理J2SE1.5的版本,改名叫J2SE5.0了。之后又把J2SE改成Java SE 6.然后一直延续到现在,因此人们常说的Java X=Java SE X=JDK1.X,都是一回事。
Java SE 8就是Java8,或者jdk1.8。
Java各个版本发行日期:
JDK 1.0 (January 23, 1996)[40]
JDK 1.1 (February 19, 1997)
J2SE 1.2 (December 8, 1998)
J2SE 1.3 (May 8, 2000)
J2SE 1.4 (February 6, 2002)
J2SE 5.0 (September 30, 2004)
Java SE 6 (December 11, 2006)
Java SE 7 (July 28, 2011)
Java SE 8 (March 18, 2014)
Java SE 9 (September 21, 2017)

//eclipse提速:
General > Startup and Shutdown : 移除所有在启动时加载的插件。
General > Editors > Text Editors > Spelling : 关闭拼写检查。
General > Validation > 勾选“Suspend all validator”。
Window > Customize Perspective > 移除所有用不到或不想用的内容(尽量使用快捷键),菜单栏也是如此(你用过几次菜单栏的打印按钮?)。
Install/Update > Automatic Updates > 取消勾选“Automatically find new updates and notify me”。
General > Appearance > 取消勾选“Enable Animations”。
使用默认的主题。其他主题可能会降低运行速度。

Java > Editor > Content Assist > 禁用“Enable Auto Activation”。在Advanced中移除所有不需要的内容(在Eclipse 4.2.2中没找到)。
jdk 放到ram disk,
https://prezi.com/xgwyp3reqanc/ubuntu-debian-ramdisk/?webgl=0

make

//make -n 即显示会执行什么命令,但是不实际执行,可以用来检查makefile执行的步骤
//列出makefile中的所有target的方法:

make -qp |
awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split($1,A,/ /);for(i in A)print A[i]}' |
sort -u

//make的调试方式:

$(warning TEXT…)
¾ 函数功能:函数“warning”类似于函数“error”,区别在于它不会导致致命错误(make 不退出),而只是提示“TEXT…”,make 的执行过程继续。

@make的@去掉,这样回显命令,知道具体是哪个命令被执行的
make --no-print-directory 这个选项需要关闭
make参数“-s”或“--slient”则是禁止所有执行命令的显示,就好像所有的命令行均使用“@”开始一样。

-p
--print-data-base
命令执行之前,打印出 make 读取的 Makefile 的所有数据(包括规则和变量的
值),同时打印出 make 的版本信息。如果只需要打印这些数据信息(不执行命
令)可以使用“make -qp”命令。查看 make 执行前的预设规则和变量,可使
用命令“make –p -f /dev/null”。

—debug[=OPTIONS]
make 执行时输出调试信息。可以使用“OPTIONS”控制调试信息级别。默认是“OPTIONS=b”,“OPTIONS”的可能值为以下这些,首字母有效(all 和 aw
等效)。
a(all)
输出所有类型的调试信息,等效于“-d”选项。
b(basic)
输出基本调试信息。包括:那些目标过期、是否重建成功过期目标文件。
v(verbose)
“basic”级别之上的输出信息。包括:解析的 makefile 文件名(比较重要),不需要重
建文件等。此选项目默认打开“basic”级别的调试信息。
i(implicit)
输出所有使用到的隐含规则描述。此选项目默认打开“basic”级别的调试
信息。
j(jobs)
输出所有执行命令的子进程,包括命令执行的 PID 等。
m(makefile)
也就是 makefile,输出 make 读取 makefile,更新 makefile,执行 makefile
的信息。

--warn-undefined-variables

gerrit

//Q:代码提交到gerrit 但是没有merge,如何用gerrit生成完整的版本包?
A:前提是不被冲掉,你编译完要赶紧下
image

比如yocto可以类似本地编译,在 build/tmp/deploy/images/spm8675p1_64/
这个地方进去可以到服务器目录
https://blog.csdn.net/whahu1989/article/details/124509095

posted on 2022-06-29 00:13  ni_sy  阅读(171)  评论(0编辑  收藏  举报