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)));
#!/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)