编程工具

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 :切换到指定进程进行调试。 缺点:但是如果父亲处于监听阻塞,无法输入命令 ②. 方法二 (gdb) set follow-fork-mode child 自动切换到子进程,不管父亲。 • (gdb) set args --port 6379

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

参考; 头文件, 库文件

流程:

  1. CMakeLists.txt 定义项目构建规则
  2. cmake生成构建文件
  3. make执行构建。

cmake的目标可以是库,也可是执行程序。前者没有main

基础选项:

  1. CMAKE最低版本:cmake_minimum_required(VERSION 3.10)

  2. 项目名称、语言:project(MyProject C)

  3. 指定执行文件和依赖源文件:add_executable(MyExecutable main.c other_file.c)

  4. 创建一个库, STATIC表示静态库:add_library(MyLibrary STATIC library.c)

  5. 链接目标文件和其他库:target_link_libraries(MyExecutable MyLibrary)

  6. 指定库目录搜索路径,不推荐使用:target_include_directories(myapp PRIVATE ${GLIB_INCLUDE_DIRS}) ,PRIVATE表示不会传递给其他目标,只自己使用

  7. 添加头文件搜索路径,全局设置,影响所有目标。现代不建议使用而是target_include_directories。:include_directories(${PROJECT_SOURCE_DIR}/include)

  8. 设置变量值:set(CMAKE_CXX_STANDARD 11)

  9. 设置目标的头文件搜索路径,

    add_library(mylib STATIC mylib.c)
       
    target_include_directories(mylib
        PUBLIC # 这些头文件用于当前target, 并传递给其他使用这个target的target
        ${CMAKE_SOURCE_DIR}/include
    )
    
  10. 条件语句

   if(expression)
     # Commands
   elseif(expression)
     # Commands
   else()
     # Commands
   endif()
  1. 安装目标到指定目录
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
  1. 普通变量和缓存变量:

缓存变量可以在CMAKE配置时修改。

set(MY_CACHE_VAR "DefaultValue" CACHE STRING "A cache variable")
set(MY_VAR "HELLO")
  1. 查找库和包

    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")

场景

  1. 导入三方库姿势:

    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}")

    2. 库自实现了.cmake文件,直接返回变量

      -- PKG_CONFIG_VERSION=1-- PKGCONFIG_FOUND=TRUE

    3. 除此之外,需要自定义路径。

    vscode 不会递归查找的,比如/usr/include/glib-2.0 只能查找include下的,不会去目录下递归

  2. 得到所有变量

    get_cmake_property(_variableNames VARIABLES)
    foreach (_var ${_variableNames})
        message(STATUS "${_var}=${${_var}}")
    endforeach ()
    
  3. 项目结构中,需要嵌套子库子模块,比如有一个子目录库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

results matching ""

    No results matching ""