相关工作如下:(补充中...)

一. linux基础

1. gcc/g++

GCC Compiler Options

$ g++ -Wall -g -o Hello.exe Hello.cpp

Compile and Link Separately

// Compile-only with -c option
> g++ -c -Wall -g Hello.cpp
// Link object file(s) into an executable
> g++ -g -o Hello.exe Hello.o

Compiler's optimization level

/*
 * 	-O0		optimization for compilation time
 * 	-O1 or -O	optimization for code size and execution time
 *	-O2		optimization more for code size and execution time
 *	-O3		optimization more for code size and execution time
 *	-Os		optimization for code size
 *	-Ofast		O3 with fast none accurate math calculations
 */
> g++ -Olevel [options] [source files] [object files] [-o output file]

Try list the default include-paths in your system used by the "GNU C Preprocessor" via "cpp -v":

> cpp -v
......
#include "..." search starts here:
#include <...> search starts here:
 d:\mingw\bin\../lib/gcc/mingw32/4.6.2/include             // d:\mingw\lib\gcc\mingw32\4.6.2\include
 d:\mingw\bin\../lib/gcc/mingw32/4.6.2/../../../../include // d:\mingw\include
 d:\mingw\bin\../lib/gcc/mingw32/4.6.2/include-fixed       // d:\mingw\lib\gcc\mingw32\4.6.2\include-fixed

Try running the compilation in verbose mode (-v) to study the library-paths (-L) and libraries (-l) used in your system:

> gcc -v -o hello.exe hello.c
......
-Ld:/mingw/bin/../lib/gcc/mingw32/4.6.2                         // d:\mingw\lib\gcc\mingw32\4.6.2
-Ld:/mingw/bin/../lib/gcc                                       // d:\mingw\lib\gcc
-Ld:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/lib // d:\mingw\mingw32\lib
-Ld:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../..                // d:\mingw\lib
-lmingw32     // libmingw32.a
-lgcc_eh      // libgcc_eh.a
-lgcc         // libgcc.a
-lmoldname
-lmingwex
-lmsvcrt
-ladvapi32
-lshell32
-luser32 
-lkernel32

The utility "ldd" examines an executable and displays a list of the shared libraries that it needs. For example

> ldd hello.exe
ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x77bd0000)
kernel32.dll => /cygdrive/c/Windows/system32/kernel32.dll (0x77600000)
KERNELBASE.dll => /cygdrive/c/Windows/system32/KERNELBASE.dll (0x75fa0000)
msvcrt.dll => /cygdrive/c/Windows/system32/msvcrt.dll (0x763f0000)

编译静态库需要注意:

> g++ -c math.cpp
> ar -r libmath.a math.o

编译动态库需要注意:

> export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH                // add ./ to LD_LIBRARY_PATH
> g++ -fPIC -c hello.cpp                                    // add -fPIC
> g++ -shared -fPIC -o libhello.so hello.o -L./ -lmath      // add libmath.a to libhello.so

Makefile宏定义:

> CFLAGS = -g -Wall -std=c++11
> CFLAGS += -DTEST_ADD
> CFLAGS += -DTEST_SUB=1

相关链接:

2. emacs操作简介

C-代表按住Ctrl键, M-代表按住Alt键

C-g        取消当前操作指令

查找

C-s 
  C-s        查找下一个
  C-r        查找上一下
  C-g        一次返回,二次结束查找
  回车       停止到当前查找到的内容

文件操作

C-x C-c        退出emacs
C-x C-f        打开文件
C-x C-s        保存文件
C-x k          不保存已修改内容

3. ar、nm操作简介

参考网址: 三个linux指令: ar, nm, objdump

nm用于列出目标文件(.a、.so、.exe)的符号清单,对于每一个符号,nm列出其值(the symbol value), 类型(the symbol type), 名字(the symbol name)

00000018 T cpu_init

符号类型说明:

A 该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。

B 该符号的值出现在非初始化数据段(bss)中。例如,在一个文件中定义全局static int test。则该符号test的类型为b,位于bss section中。其值表示该符号在bss段中的偏移。一般而言,bss段分配于RAM中

C 该符号为common。common symbol是未初始话数据段。该符号没有包含于一个普通section中。只有在链接过程中才进行分配。符号的值表示该符号需要的字节数。例如在一个c文件中,定义int test,并且该符号在别的地方会被引用,则该符号类型即为C。否则其类型为B。

D 该符号位于初始话数据段中。一般来说,分配到data section中。例如定义全局int baud_table[5] = {9600, 19200, 38400, 57600, 115200},则会分配于初始化数据段中。

G 该符号也位于初始化数据段中。主要用于small object提高访问small data object的一种方式。

I 该符号是对另一个符号的间接引用。

N 该符号是一个debugging符号。

R 该符号位于只读数据区。例如定义全局const int test[] = {123, 123};
则test就是一个只读数据区的符号。注意在cygwin下如果使用gcc直接编译成MZ格式时,源文件中的test对应_test,并且其符号类型为D,即初始化数据段中。但是如果使用m6812-elf-gcc这样的交叉编译工具,源文件中的test对应目标文件的test,即没有添加下划线,并且其符号类型为R。一般而言,位于rodata section。值得注意的是,如果在一个函数中定义const char *test = “abc”, const char test_int = 3。使用nm都不会得到符号信息,但是字符串“abc”分配于只读存储器中,test在rodata section中,大小为4。

S 符号位于非初始化数据区,用于small object。

T 该符号位于代码区text section。

U 该符号在当前文件中是未定义的,即该符号的定义在别的文件中。例如,当前文件调用另一个文件中定义的函数,在这个被调用的函数在当前就是未定义的;但是在定义它的文件中类型是T。但是对于全局变量来说,在定义它的文件中,其符号类型为C,在使用它的文件中,其类型为U。

V 该符号是一个weak object。

W The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.

- 该符号是a.out格式文件中的stabs symbol。

? 该符号类型没有定义

4. readelf操作简介

参考网址

readelf (查看ELF文件信息,包含.a、.so、可执行文件),例如:

>$ readelf -h /bin/cp
>$ Machine:                           Advanced Micro Devices X86-64 或者 ARM(android)

5. scp使用简介

参考网址

5.1 拷贝远端文件到本地: scp username@hostName:remotePath/fileName localPath/fileName

eg,. use cygwin:

scp root@192.168.1.128:/usr/lsclone/1.txt .
scp root@lsclonedemini:/usr/lsclone/1.txt 1.txt
scp -r  root@192.168.1.128:/usr/lsclone/tmpdir .

5.2 上传本地文件到远端: scp localPath/fileName username@hostName:remotePath/fileName

eg,. use cygwin:

scp /cygdrive/c/Users/1.txt root@192.168.1.128:/usr/lsclone/
scp /cygdrive/c/Users/1.txt root@lsclonedemini:/usr/lsclone/1.txt
scp -r  /cygdrive/c/Users/tmp root@192.168.1.128:/usr/lsclone/

6. gettimeofday使用简介

struct timeval start, end;
gettimeofday(&start, NULL);
...
gettimeofday(&end, NULL);
printf("%ld\n", ((end.tv_sec * 1000000 + end.tv_usec)
    - (start.tv_sec * 1000000 + start.tv_usec)));

二. shell脚本、Makefile编写

#!/bin/bash

DIR="./"

echo "ndk building"
cd ${DIR}/jni
ndk-build -B

echo "zipping"
cd ${DIR}/tmp
zip -rv ../libs.zip *
rm -rf ${DIR}/tmp

$ sh -x build.sh

TARGET = ../../../samples/libs/libtest.a

SRC_FILE = $(shell find ./src/ -maxdepth 1)

CSRC = $(filter %.c, $(SRC_FILE))
COBJS = $(patsubst %.c, %.o, $(CSRC))

CPPSRC = $(filter %.cc, $(SRC_FILE))
CPPOBJS = $(patsubst %.cc, %.o, $(CPPSRC))

AR = ar
CC = gcc
CXX = g++
FLAGS = -g -Wall -std=c++11
FLAGS += -DCX_OLAWORKS
FLAGS += -DROP_ENABLE=0
FLAGS += -I./include/
#LIBS = -L../../../samples/libs/ -lplatform

all : $(TARGET)

$(TARGET) : $(CPPOBJS) $(COBJS)
	$(AR) -r $@ $+ $(LIBS)

$(COBJS) : %.o : %.c
	$(CXX) $(FLAGS) -c $< -o $@
	
$(CPPOBJS) : %.o : %.cc
	$(CXX) $(FLAGS) -c $< -o $@

distclean : clean
	rm -f $(TARGET)

clean :
	rm -f $(COBJS) $(CPPOBJS)

三. 其他相关基础知识,包括sqlite等相关开源代码