FIX: merge gcc_g++ create shared lib

FIX: C in linux  read  KEY
    FIX: .bashrc  echo  DIR
    FIX: gcc_g++ create shared lib
This commit is contained in:
rangersly 2025-05-09 18:07:44 +08:00
parent 5f3ef05755
commit cf4b2cb324
10 changed files with 105 additions and 113 deletions

View File

@ -4,8 +4,8 @@
[[ $- != *i* ]] && return [[ $- != *i* ]] && return
# 历史记录配置 # 历史记录配置
HISTSIZE=5000 # 内存中保存的历史记录数量 HISTSIZE=10000 # 内存中保存的历史记录数量
HISTFILESIZE=5000 # 历史文件最大行数 HISTFILESIZE=10000 # 历史文件最大行数
HISTCONTROL=ignoreboth # 忽略重复命令和空格开头的命令 HISTCONTROL=ignoreboth # 忽略重复命令和空格开头的命令
shopt -s histappend # 追加历史而不是覆盖 shopt -s histappend # 追加历史而不是覆盖
@ -27,9 +27,9 @@ alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto' alias egrep='egrep --color=auto'
# 更详细的ls别称 # 更详细的ls别称
alias ll='ls -alFh --group-directories-first' alias l='ls -alFh --group-directories-first'
alias la='ls -A' alias la='ls -A'
alias l='ls -CF' # alias l='ls -CF'
# PS1提示符 # PS1提示符
@ -64,12 +64,12 @@ parse_git_branch() {
# 处理路径:长路径时只保留每级目录首字母 # 处理路径:长路径时只保留每级目录首字母
local DIR=${PWD/#$HOME/\~} local DIR=${PWD/#$HOME/\~}
if [ ${#DIR} -gt 25 ]; then if [ ${#DIR} -gt 30 ]; then
DIR=$(echo $DIR | awk -F '/' '{ DIR=$(echo $DIR | awk -F '/' '{
if (length($0) > 20) { if (length($0) > 30) {
for (i=1; i<=NF; i++) { for (i=1; i<=NF; i++) {
if (i == NF) printf "/%s", $i; if (i == NF) printf "%s", $i;
else if (length($i) > 0) printf "/%.2s", $i; else printf "%.3s/", $i;
} }
} }
else print $0; else print $0;
@ -93,14 +93,13 @@ parse_git_branch() {
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ ' PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
# 安全操作确认 # 安全操作确认
alias rm='rm -i' alias rr='rm -i'
alias cp='cp -i' #alias cp='cp -i'
alias mv='mv -i' #alias mv='mv -i'
# 快速导航 # 快速导航
alias ..='cd ..' alias ..='cd ..'
alias ...='cd ../..' alias ...='cd ../..'
alias ....='cd ../../..'
alias ~='cd ~' alias ~='cd ~'
# 网络相关 # 网络相关

59
program/c_cpp/linux/key.c Normal file
View File

@ -0,0 +1,59 @@
#include <iostream>
#include <unistd.h>
#include <termio.h>
static struct termios original;
void enable_raw_mode() {
tcgetattr(STDIN_FILENO, &original);
struct termios raw = original;
raw.c_lflag &= ~(ICANON | ECHO);
raw.c_cc[VMIN] = 0;
raw.c_cc[VTIME] = 1;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);
}
void disable_raw_mode() {
tcsetattr(STDIN_FILENO, TCSAFLUSH, &original);
}
int kbhit() {
char ch;
int n = read(STDIN_FILENO, &ch, 1);
if (n == 1) return ch;
return -1;
}
int main() {
enable_raw_mode();
atexit(disable_raw_mode); // 确保程序退出时恢复终端
printf("Press 'q' to quit\n");
while (1) {
int key = kbhit();
if (key != -1) {
printf("Key: %c (0x%02x)\n", key, key);
if (key == 'q') break;
}
// 在这里添加逻辑
usleep(10000); // 10ms延迟减少CPU占用
}
return 0;
}
// struct termios
// {
// tcflag_t c_iflag; /* input mode flags */
// tcflag_t c_oflag; /* output mode flags */
// tcflag_t c_cflag; /* control mode flags */
// tcflag_t c_lflag; /* local mode flags */
// cc_t c_line; /* line discipline */
// cc_t c_cc[NCCS]; /* control characters */
// speed_t c_ispeed; /* input speed */
// speed_t c_ospeed; /* output speed */
// #define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
// #define _HAVE_STRUCT_TERMIOS_C_OSPEED 1
// };

View File

@ -1,41 +0,0 @@
#include <iostream>
#include <unistd.h>
#include <termio.h>
using namespace std;
int key() {
// struct termios
// {
// tcflag_t c_iflag; /* input mode flags */
// tcflag_t c_oflag; /* output mode flags */
// tcflag_t c_cflag; /* control mode flags */
// tcflag_t c_lflag; /* local mode flags */
// cc_t c_line; /* line discipline */
// cc_t c_cc[NCCS]; /* control characters */
// speed_t c_ispeed; /* input speed */
// speed_t c_ospeed; /* output speed */
// #define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
// #define _HAVE_STRUCT_TERMIOS_C_OSPEED 1
// };
unsigned char in;
struct termios new_settings, old_settings;
tcgetattr(STDIN_FILENO,&old_settings); //获得stdin 输入
new_settings = old_settings;
new_settings.c_lflag &= (~ICANON);
// new_settings.c_cc[VTIME] = 0;
// tcgetattr(STDIN_FILENO,&old_settings); //获得stdin 输入
// new_settings.c_cc[VMIN] = 1;
tcsetattr(STDIN_FILENO,TCSANOW,&new_settings); //
in = getchar();
tcsetattr(STDIN_FILENO,TCSANOW,&old_settings);
return in;
}
int main() {
while(1)
printf(" %d \n", key());
return 0;
}

View File

@ -3,7 +3,7 @@
## 目录 ## 目录
- [define](#define) - [define](#define)
- [预定义宏](#预定义宏) - [预定义宏](#预定义宏)
- [defined](# defined) - [defined](#defined)
- [ifdef](#ifdef) - [ifdef](#ifdef)
- [ifndef](#ifndef) - [ifndef](#ifndef)
- [undef](#undef) : 若要修改一个宏,先移除再定义 - [undef](#undef) : 若要修改一个宏,先移除再定义
@ -51,5 +51,6 @@
--- ---
## pragma ## pragma
由编译器定义的预处理指令,若不支持则无操作
`#pragma once` 确保头文件只被包含一次 `#pragma once` 确保头文件只被包含一次

View File

@ -5,9 +5,9 @@
## INDEX ## INDEX
- [字符串库函数](# std-string) - [字符串库函数](#std-string)
- [内存操作标准库函数](# std-mem) - [内存操作标准库函数](#std-mem)
- [与string容器转换](# to-string) - [与string容器转换](#to-string)
--- ---

View File

@ -2,15 +2,13 @@
+ 使用const关键字 + 使用const关键字
+ 避免频繁进行内存分配和释放 + 避免频繁进行内存分配和释放
+ 尽量减少值传递,多用引用来传递参数 + 尽量减少值传递,多用引用来传递参数
+ 局部变量VS静态变量多次调用局部更快,因为局部变量可以读入寄存器,静态不行 + 局部变量VS静态变量多次调用可能局部更快)
+ ++i和i++的效率问题(使用迭代器可能比使用指针更优:迭代器++i可以减少一次构造和析构 + ++i和i++的效率问题(使用迭代器可能比使用指针更优:迭代器++i可以减少一次构造和析构
+ 避免使用多重继承 + 避免使用多重继承
+ 低级代码使用位运算替代算术运算 + 低级代码使用位运算替代算术运算
+ 使用编译器自带的优化选项
+ 将小粒度函数声明为内联函数inline + 将小粒度函数声明为内联函数inline
+ 循环内定义,还是循环外定义对象:由构造函数和复制操作的效率比较决定 + 循环内定义,还是循环外定义对象:由构造函数和复制操作的效率比较决定
+ 小函数放在同一循环内效率高大函数分开放效率更高由cpu寄存器决定 + 小函数放在同一循环内效率高大函数分开放效率更高由cpu寄存器决定
+ 尽量少使用`dynamic_cast` + 尽量少使用`dynamic_cast`
+ 减少除法运算的使用,除数尽量使用常量,让编译器优化 + 减少除法运算的使用,除数尽量使用常量,让编译器优化
+ 多用直接初始化 + 多用直接初始化
+ 循环展开加速

View File

@ -4,7 +4,6 @@
- [extern](#extern) - [extern](#extern)
- [noexcept](#noexcept) - [noexcept](#noexcept)
- [重载](#) - [重载](#)
- [often](#often)
## extern ## extern
@ -28,20 +27,3 @@ noexcept 的一个重要用途是优化性能,特别是在移动语义中。
+ const左值选择const T& + const左值选择const T&
+ 右值优先选择T&&, else const T& + 右值优先选择T&&, else const T&
+ 字面量或临时对象选择T&& + 字面量或临时对象选择T&&
## often
```
abs(x); //求x的绝对值 e.g.abs(-5)=5
fabs() //实数绝对值
exp(x); //求x的自然指数e^x e.g.exp(1)=2.718282
floor(x); //向下取整
ceil(x); //向上取整
log(x); //求实数x的自然数对数 e.g.log(1)=0
pow(x,y); //计算x^y,输出为双精度实数 e.g.pow(2,3)=8
sqrt(x); //求x的平方根 e.g.sqrt(25)=5
strlen(str);获取字符数组长度(只能用在字符数组)。
max(a,b) //两数中最大
min(a,b) //两数中最小
swap(a,b) //交换两个类型相同的变量
```

View File

@ -1,20 +1,20 @@
# c with cpp io # c with cpp io
# 目录 # INDEX
- [标准IO流](# IOstream) - [标准IO流](#IOstream)
- [C](# C) - [C](#C)
- [格式化IO](# 格式化IO) - [格式化IO](#格式化IO)
- [字符IO](# charIO) - [字符IO](#charIO)
- [Cstring](# Cstring) - [Cstring](#Cstring)
- [C二进制IO](# Cbin) - [C二进制IO](#Cbin)
- [C文件操作](# C-FILE) - [C文件操作](#C-FILE)
- [error](# c-error) - [error](#c-error)
- [cpp stdio](# cpp stdio) - [cpp stdio](#cpp stdio)
- [cpp fio](# cpp fio) - [cpp fio](#cpp fio)
- [关闭缓冲区读取](# ../linux/ncurses.c) - [关闭缓冲区读取](#../linux/ncurses.c)
- [ANSI](# ./ansi.md) - [ANSI](#./ansi.md)
--- ---

View File

@ -76,14 +76,8 @@
g++ -o main -l库名 -L库路径 -I头文件路径 g++ -o main -l库名 -L库路径 -I头文件路径
// g++ -o main -ltest -L/home/e0x1a/test // g++ -o main -ltest -L/home/e0x1a/test
#### `-rpath 是 GNU 链接器的一个选项,它会在可执行文件中嵌入运行时库搜索路径` #### 编译主程序时链接动态库
`gcc -o myapp myapp.c -L../libs -lmylib -Wl,--enable-new-dtags,-rpath,'$ORIGIN/../libs'` - `gcc -o myprogram main.c -L. -lmylib -Wl,-rpath=.`
``` - `-L.` 告诉编译器在当前目录中查找动态库文件
-Wl,-rpath,/path/to/libs - `-lmylib` 链接名为 libmylib.so 的动态库
-Wl 告诉 GCC 将后面的参数传递给链接器 - `-Wl,-rpath=.` 将运行时路径嵌入到可执行文件中,强制程序运行时优先从当前目录加载动态库
-rpath 是链接器选项
/path/to/libs 是要嵌入的运行时搜索路径
```
如果是动态库,需要指定 `LD_LIBRARY_PATH` 环境变量 //待查
`echo $LD_LIBRARY_PATH` 查看

View File

@ -2,17 +2,17 @@
`.` 重复上一个操作 `.` 重复上一个操作
## 目录 ## 目录
- [录制宏](# 录制宏) - [录制宏](#录制宏)
- [打开终端](# 打开终端) - [打开终端](#打开终端)
- [快捷键](# 快捷键) - [快捷键](#快捷键)
- [移动](# 移动) - [移动](#移动)
- [插入](# 插入) - [插入](#插入)
- [修改](# 修改) - [修改](#修改)
- [删除](# 删除) - [删除](#删除)
- [复制](# 复制) - [复制](#复制)
- [基本补全](# 基本补全) - [基本补全](#基本补全)
- [补全菜单](# 补全菜单) - [补全菜单](#补全菜单)
- [vimrc](# ./.vimrc) - [vimrc](#./.vimrc)
## 录制宏 ## 录制宏
使用 q[Key] 开始录制宏,再次点击q结束录制 使用 q[Key] 开始录制宏,再次点击q结束录制