编程工具
makefile
如果一行太长,用/连接
SRC_SERVER = array.c connect_manager.c connection_table.c connection.c \
log.c message_manager.c message_queue.c message.c mutex.c server.c socket.c queue.c
-n 选项会 打印编译命令,但不会实际执行。
-B 强制重新编译: 无视时间戳
make 的依赖检测机制:看bin文件的时间戳和源文件的时间戳,如果bin比较新,那就认为make update
wildcard
SRCS = $(SRC_DIR)/*.c
SRCS = $(wildcard $(SRC_DIR)/*.c)
前者不会展开 只有在 bash命令如ls下面管用。
gcc 默认头/usr/include
, /usr/local/include
, 库文件/usr/lib
, /usr/local/lib
#默认头文件路径 starts here
gcc -xc -E -v -
# 默认库文件路径
gcc -print-search-dirs
# 特定库路径. 如果有返回,即有存在
gcc -print-file-name=libcrypto.so
# 指定库路径
gcc main.c -o my_program -L/usr/local/ssl/lib -lssl -lcrypto
链接-l一定要放在gcc最后
ruby测试
RSpec
describe "MyTestSuite" do
it "does something" do
\# test code goes here
end
end
rspec file.rb
gdb
两种设置参数:
gdb ./kilo
(gdb) set args t.txt
(gdb) ru
gdb –args ./bin/redis –sentinel –config conf/server.conf
Watch Info watch Delete num
怎么让gdb调试程序 比如输出在另外一个窗口?
重定向 方法1:👌 run > output.log run > output.log 2>&1 方法2: gdb ./myprogram > output.log
Segmentation fault (core dumped)溯源: Run 程序崩溃后,会提示 Segmentation fault,并显示出 崩溃发生的位置:
p/s
p/x
p/c
x/5xb
x/5cb
gdb 断点在子进程生效吗?
默认不生效,提示detach。
①. 方法一
(gdb) set detach-on-fork off 通过设置同时调试父子。
切换命令:
• info inferiors:查看当前所有受控进程。
• inferior
tcpdump
tcpdump tcp port 5000 and host 210.27.48.1
tcpdump port 5000 | port 3000 |
lsof -i:端口
kill -9 pid
查看进程下线程高占用:
top -Hp pid
网络
/resolv.conf
cmake
参考; 头文件, 库文件
流程:
- CMakeLists.txt 定义项目构建规则
- cmake生成构建文件
- make执行构建。
cmake的目标可以是库,也可是执行程序。前者没有main
基础选项:
-
CMAKE最低版本:
cmake_minimum_required(VERSION 3.10)
-
项目名称、语言:
project(MyProject C)
-
指定执行文件和依赖源文件:
add_executable(MyExecutable main.c other_file.c)
-
创建一个库,
STATIC
表示静态库:add_library(MyLibrary STATIC library.c)
-
链接目标文件和其他库:
target_link_libraries(MyExecutable MyLibrary)
-
指定库目录搜索路径,不推荐使用:
target_include_directories(myapp PRIVATE ${GLIB_INCLUDE_DIRS})
,PRIVATE
表示不会传递给其他目标,只自己使用 -
添加头文件搜索路径,全局设置,影响所有目标。现代不建议使用而是
target_include_directories
。:include_directories(${PROJECT_SOURCE_DIR}/include)
-
设置变量值:
set(CMAKE_CXX_STANDARD 11)
-
设置目标的头文件搜索路径,
add_library(mylib STATIC mylib.c) target_include_directories(mylib PUBLIC # 这些头文件用于当前target, 并传递给其他使用这个target的target ${CMAKE_SOURCE_DIR}/include )
-
条件语句
if(expression)
# Commands
elseif(expression)
# Commands
else()
# Commands
endif()
- 安装目标到指定目录
install(TARGETS target1 [target2 ...]
[RUNTIME DESTINATION dir] # 执行文件
[LIBRARY DESTINATION dir] # 动态库
[ARCHIVE DESTINATION dir] # 静态库
[INCLUDES DESTINATION [dir ...]] # 头文件,
[PRIVATE_HEADER DESTINATION dir]
[PUBLIC_HEADER DESTINATION dir])
install例子:
add_executable(myapp main.c)
add_library(mylib STATIC mylib.c)
install(TARGETS myapp mylib
RUNTIME DESTINATION bin # 安装可执行文件到 bin/
ARCHIVE DESTINATION lib # 安装静态库到 lib/
INCLUDES DESTINATION include # 如果设置了 target_include_directories,会覆盖生效
)
<install-prefix>/bin/myapp
<install-prefix>/lib/libmylib.a
install-prefix由CMAKE_INSTALL_PREFIX决定,默认是/usr/local
- 普通变量和缓存变量:
缓存变量可以在CMAKE配置时修改。
set(MY_CACHE_VAR "DefaultValue" CACHE STRING "A cache variable")
set(MY_VAR "HELLO")
-
查找库和包
find_package(<PackageName> [version] [REQUIRED] [components...])
find_package(GLib REQUIRED)
找glib库,找不到就中断构建。 components表示子模块。会自动设置对应的头文件目录和库文件目录变量。
GLIB_INCLUDE_DIRS, GLIB_LIBRARIES
查找路径:系统默认;CMAKE_PREFIX_PATH
要求库必须支持.cmake,即实现了
PACKAGE.cmake
提供信息。会有对应输出提示
-- Found PkgConfig: /usr/bin/pkg-config (found version "1.8.1")
场景
-
导入三方库姿势:
-
库支持
pkg-config
,通过pkg-config
返回变量pkg_check_modules(<prefix> [REQUIRED] <module> [<module>...])
:prefix
为输出变量的前缀,生成的变量有:prefix_VERSION
..find_package(PkgConfig REQUIRED) pkg_check_modules(GLIB REQUIRED glib-2.0)
对应输出
-- Checking for module 'glib-2.0' -- Found glib-2.0, version 2.74.6
且会自动设置对应目录
message(STATUS "GLIB_INCLUDE_DIRS: ${GLIB_INCLUDE_DIRS}")
-
库自实现了
.cmake
文件,直接返回变量-- PKG_CONFIG_VERSION=1
,-- PKGCONFIG_FOUND=TRUE
-
除此之外,需要自定义路径。
vscode 不会递归查找的,比如/usr/include/glib-2.0 只能查找include下的,不会去目录下递归
-
-
得到所有变量
get_cmake_property(_variableNames VARIABLES) foreach (_var ${_variableNames}) message(STATUS "${_var}=${${_var}}") endforeach ()
-
项目结构中,需要嵌套子库子模块,比如有一个子目录库
mempool
在主
cmake
中加入add_subdirectory(mempool)
构建流程
mkdir build
cd build
cmake ..
make
make MyExecutable
make clean
仅修改源文件.c.h:直接make
即可
更改编译选项等:需要cmake ..
重新
###
cmake … 参数为路径,到哪里执行cmake
project_source_dir : cmake执行所在目录
CMAKE_CURRENT_SOURCE_DIR ; 同样,为cmake执行路径
cmake自定义宏, 使得一些代码是否进入。调试开关
## vim
vim -b /tmp/mypool.dat
:%!xxd
- :% 表示对整个文件进行操作。
- ! 表示执行外部命令。
- xxd 是一个十六进制编辑工具,它可以将文件的内容转换为十六进制格式并显示出来。
git
ssh 22 问题
ssh -T git@github.com
.gitignore
**/data/
忽略任意目录下的data目录
**/data/*
忽略任意目录下的data目录下文件,但保留目录本身,在data下放.gitkeep空文件
对已经提交到 Git 仓库里的文件,后续 .gitignore
是无效的。
git rm -r –cached 删除暂存区的文件。 git rm -r --cached *.json
git status –ignored
git 远程SSH, https方式
git remote -v
git remote set-url origin https://github.com/ddongzi/ddongzi.github.io.git
git remote set-url origin git@github.com:ddongzi/ddongzi.github.io.git
从稳定commit点 建立新分支:
git checkout <commit_id>
git checkout -b 新分支名 // 重命名
git branch # 看当前有哪些分支 git log –oneline –graph –all # 查看历史提交图
从其他分支pick一些commit过来:
git check-pick <commit-id>
报错: 改用https,切换vpn
fetch-pack: unexpected disconnect while reading sideband packet fatal: early EOF fatal: unpack-objects failed
远程提交撤回到某个版本
git reset –soft 版本号
包管理,查找头文件
debian系统查询包
dpkg-query -L libssl-dev # -L 参数查询包
dpkg-query -W package_name # -W 看是否安装
find /usr/include/ -name glib.h
man(manual)
标准方法:直接用 man 3 函数名
。
比如查 fopen
:
man 3 fopen
解释:
man
是 manual(手册)。3
是 库函数(C standard library) 的章节号。(fopen
属于第3章)fopen
是你要查的函数。
🔵 常用章节分类小记:
-
man 1 xxx
— 命令(ls、gcc等) man 2 xxx
— 系统调用(open、read、write、fork, getsockopt)man 3 xxx
— C库函数(fopen、printf、malloc)
Valgrind
Invalid write of size 4