linux/cmake 常用命令
Linux 命令
- ldconfig
创建所需的链接并缓存到标准库目录中找到的最新共享库. - ldd filename
显示特定Linux命令需要运行的共享对象文件。 - file filename
展示文件属性 - set
当前终端进程的shell variable,不会遗传给子进程,注意和environment variable做区分 - ar -t
对于静态库,显示存档archive的内容 - du
展示目录下文件大小 - gcc -I . -c mathDemo.c
-I . means tell gcc search headerfiles in the specific folder, in the example is . - environment variable (globally)
- etc/zsh/zprofile (source)
- etc/profile (source)
- etc/proifile.d/*sh
- environment variable (per-user)
- ~/.zshenv
- ~/.zshrc
zshenv 是在任何情况下都会被读取的文件,它用于设置一些全局的环境变量,比如 $PATH, $EDITOR 等。它通常不用于设置交互式 shell 的选项,比如 $PROMPT, aliases, functions 等。
chmod u/g/a +s
设置目标文件的set-user-id/set-group-id/全部标志,使得文件可以被不同UID用户执行时设置EUID为ownerID/groupID,前提是设置others的权限为可以执行文件- 数字模式下set-user-id 对应的比特位值为4, set-group-id 对应的比特位值为2,他们对应的比特位在u,g,o之前, 这个比特位表示执行该文件的真实用户在执行该文件时可以获得该文件的拥有者的特权
- 补充linux的setuid函数
- 如果调用进程具有特权(有效用户为0/root),则此函数将进程的实际用户ID和有效用户ID都设置为newuid。如果有的话,它还会删除进程的文件用户ID。newuid可以是任何合法值。(一旦完成此操作,将无法恢复旧的有效用户ID。),所以对于特权进程而言,如果只是暂时想要放弃特权,应该使用seteuid函数
- 如果调用进程不具有特权,则该函数和seteuid类似,只是将该函数将进程的有效用户ID设置为neweuid,前提是进程被允许更改其有效用户ID。具有特权的进程(有效用户ID为零)可以将其有效用户ID更改为任何合法值。具有文件用户ID的非特权进程可以将其有效用户ID更改为其实际用户ID或文件用户ID。
chmod u/g/o/a +/-/= r/w/
操作符+会将所选文件的模式位添加到每个文件的现有模式位中;-会将它们移除;=会将它们添加,并且将未提及的位移除,但目录的未提及的设置用户和组ID位不受影响。- the user who owns it (u), other users in the file’s group (g), other users not in the file’s group (o)
- 数字模式下u对应的比特位为第二位,之后是g,最后为o,位上的值4代表着读,2代表着写,1代表可执行
chmod -r
表示递归设置目录文件下的所有文件**chown root:root
设置owner为root,group为rootps command
- 这条命令创建出三个进程,一个会话,两个进程组,bash是ps和less的父进程,则ps和less的PPID对应bash的PID
- bash命令是整个会话组的首领(会话组:一些有关联的进程组),会话首领对应的SID和进程组PGID以及PID都是相同的
- bash进程fork出两个子进程ps和less,ps和less同属一个进程组,ps是该进程组的首领
ps -ef 列出所有进程(all process)的详细信息(full-format, including command lines)
ps aux 列出前台进程(all with tty),后台进程(processes without controlling ttys)
其中STAT状态位常见的状态字符有
D //无法中断的休眠状态(通常 IO 的进程)
R //正在运行可中在队列中可过行的;
S //处于休眠状态;
T //停止或被追踪;
W //进入内存交换 (从内核2.6开始无效);
X //死掉的进程 (基本很少见);
Z //僵尸进程;
< //优先级高的进程
N //优先级较低的进程 ****
L //有些页被锁进内存;
s //进程的领导者(在它之下有子进程);
l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ //位于后台的进程组;**cat**
- cat filename 显示文件内容
- cat > filname1 将标准输入中的内容重定向到filename1中(用ctrl+d作为EOF结束输入)
- cat > filename2 <<EOF 将开始标记EOF和结束标记EOF之间的标准输入中的内容重定向到fiilname2
- cat >> filename3 在filename3中追加内容
更多关于重定向的内容:Shell 输入/输出重定向
wc -l filename
计算file中的行数telnet开启本地回显
1
2
3telnet
set localecho
open <host ip> <port>基本正则表达式(BRE)和扩展正则表达式(ERE)是指定模式语法的两种变体。sed命令使用BRE语法
在对比如小括号()进行处理时两者有所区别,在BRE内,单独小括号是指文本中的小括号,加了backflash(也就是反斜杠)转义之后是模式匹配的意义,ERE相反,ERE的详细信息sed -i 's/\(.*\)apple/\1banana/g' fruits.txt(需要修改的文件名)
解释:- s表示用字符串匹配模式,标准写法为”s/pattern/replacement/flag”, flag g表示替换所有非重叠实例,而不仅仅是第一次匹配
- i表示将文件修改之后的内容不再输入标准输出(默认行为),而是直接在文件内部修改
- .表示匹配任意一个字符,*表示这个字符出现0次或多次,用括号括起来表示捕获这个组,\1表示引用之前捕获的第一个组,所以这行命令的意思为将每行行尾出现的apple替换为banana
strace
跟踪系统调用和信号
选项:- p: pid,指定进程
touch filename
跟踪系统调用和信号- 批量创建文件:touch file{1..5}.txt
find exec组合
语法:
find [path] [arguments] -exec [command] {} ;
or
find [path] [arguments] -exec [command] {} +
find exec 命令实例教程find . -type f -name '*.txt' -exec sh -c 'mv "$1" "${1%.txt}.js"' _ {} \;
- 解释: ;对;进行转义,表示command的结束,{}存储find命令执行的结果, _是占位符,表示$0
- find找出所有后缀为txt的文件并使用sh -c启动subshell执行mv命令,将sh传给其的第二个参数(e.g., 1.txt)中的txt删除并替换为.js
Inode保存文件的元数据。分别是:Inode编号、文件权限、文件的拥有者的UID、文件所属组的GID、硬链接数、文件的大小、文件的间戳、指向磁盘文件的数据块指针等。其信息如下图所示:
通过stat命令可以查看文件的inode信息:
kill
杀死进程
语法: pid/job_sepc(作业标识符)
选项:- -l 列出所有信号
- 默认发送SIGTERM信号
- -9/KILL发送SIGKILL信号
- -1/HUP发送SIGHUP信号
- -15/TERM发送SIGTERM信号
fg
将后台进程移动至前台(tty/pts)执行
语法 : fg [job_spec]1
2
3
4
5
6
7# 运行sleep命令,然后按下ctrl+z。
sleep 60
^Z
[1]+ Stopped sleep 60
# 使用fg命令使得作业在前台运行。
fg %1nm
查看库的符号表nm ./build/libMyLibExample.a
ulimit
控制shell程序的资源,作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0 #core文件的最大值为100 blocks。
data seg size (kbytes, -d) unlimited #进程的数据段可以任意大。
scheduling priority (-e) 0
file size (blocks, -f) unlimited #文件可以任意大。
pending signals (-i) 98304 #最多有98304个待处理的信号。
max locked memory (kbytes, -l) 32 #一个任务锁住的物理内存的最大值为32KB。
max memory size (kbytes, -m) unlimited #一个任务的常驻物理内存的最大值。
open files (-n) 1024 #一个任务最多可以同时打开1024的文件。
pipe size (512 bytes, -p) 8 #管道的最大空间为4096字节。
POSIX message queues (bytes, -q) 819200 #POSIX的消息队列的最大值为819200字节。
real-time priority (-r) 0
stack size (kbytes, -s) 10240 #进程的栈的最大值为10240字节。
cpu time (seconds, -t) unlimited #进程使用的CPU时间。
max user processes (-u) 98304 #当前用户同时打开的进程(包括线程)的最大个数为98304。
virtual memory (kbytes, -v) unlimited #没有限制进程的最大地址空间。
file locks (-x) unlimited #所能锁住的文件的最大个数没有限制。shell脚本中的特殊变量
$$
: shell的PID$0
: shell的类型$_
: 表示上一个命令的最后一个参数
- unzip
专用于解压zip文件 - curl
下载某url上的资源- -x : 使用代理
- -L : 追踪重定向
- -s : 静默模式,不输出任何内容
- -v : 展示通信的整个内容
- -o : 输出的内容定向到某文件
使用socks5代理获取google网页文件:curl -x socks5://127.0.0.1:1080 https://www.google.com -v
- wget
valgrind 调试工具
- valgrind
系统监测工具
- tcpdump/
- host/
- telnet/
- route/
- iptables/
- netstat/
- nc
cmake
cmake具体流程
CMakeLists.txt脚本在配置步骤期间执行。该脚本负责定义目标。每个目标表示构建流程的可执行文件、库或其他输出。如果配置步骤成功——也就是说,CMakeLists.txt没有错 误——CMake将使用脚本定义的目标生成构建流程。生成的构建流程类型取决于所使用的生成器类型,在配置步骤期间,根据CMakeLists.txt的内容,可能会发生其他事情。
virsual stdio提供了configure with cmake debugger, 可以设置cmakelists的断点来调试配置过程vs中可以选择在UI中选择cmake的kit来指定编译器及其配套组件
命令行中通过设置cmake的–config选项可以指定编译源文件时是按debug模式还是release模式编译
cmake commands
- 创建静态库
1
2
3add_library(hello_library STATIC
src/Hello.cpp
)
- hello_library 即为要创建的库文件的名称,该库文件是全局共享的
补充:
GCC 命令行创建静态库:gcc -c somfile.c -o somefile.o
使用binutils软件包中的ar工具将目标文件转换为静态库(存档)ar rcs libfoo.a somfile.o
当链接到库时,GCC 会自动从 .a 文件扩展名识别出该库是静态链接的存档。gcc ... -lfoo ...
GCC 命令行创建动态库:
使用位置无关代码选项-fPIC将每个源文件编译为目标文件gcc ... -c -fPIC some_file.c ...
从目标文件中链接共享库:gcc -shared -o libfoo.so.x.y -Wl,-soname,libfoo.so.x some_file.o ...
使用的主版本号为 X,次版本号为 Y
创建用于soname机制的符号链接结构(软链接):ln -s libfoo.so.x.y libfoo.so.x
ln -s libfoo.so.x libfoo.so
- 链接库
1
2
3
4target_link_libraries( hello_binary
PRIVATE
hello_library
)
- 这里的库文件应该是之前使用add_library创建的,若该库是在别的CML下创建的,则应在当前CML使用add_subdirectory(source_dir)引入创建该库的CML所在的目录source_dir
- add_subdirectory(source_dir)其实就是执行了在source_dir下的CML,生成的库文件或可执行文件若没有指定其余参数则会存放在build之后的source_dir目录下
- 添加目标编译所需要的头文件
1 |
|
- private将头文件目录的作用域限制在当前目标,而不会传递给依赖当前目标的其他目标,这表明其他目标若想使用该头文件,需显式将其添加
- 使用该命令之后,在源文件中引入头文件时可以直接使用头文件名,不需要特定加入相对或者绝对地址