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:
parent
5f3ef05755
commit
cf4b2cb324
@ -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
59
program/c_cpp/linux/key.c
Normal 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
|
||||||
|
// };
|
||||||
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
@ -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` 确保头文件只被包含一次
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
|
|
||||||
## INDEX
|
## INDEX
|
||||||
|
|
||||||
- [字符串库函数](# std-string)
|
- [字符串库函数](#std-string)
|
||||||
- [内存操作标准库函数](# std-mem)
|
- [内存操作标准库函数](#std-mem)
|
||||||
- [与string容器转换](# to-string)
|
- [与string容器转换](#to-string)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
@ -2,15 +2,13 @@
|
|||||||
+ 使用const关键字
|
+ 使用const关键字
|
||||||
+ 避免频繁进行内存分配和释放
|
+ 避免频繁进行内存分配和释放
|
||||||
+ 尽量减少值传递,多用引用来传递参数
|
+ 尽量减少值传递,多用引用来传递参数
|
||||||
+ 局部变量VS静态变量(多次调用局部更快,因为局部变量可以读入寄存器,静态不行)
|
+ 局部变量VS静态变量(多次调用可能局部更快)
|
||||||
+ ++i和i++的效率问题(使用迭代器可能比使用指针更优:迭代器++i可以减少一次构造和析构)
|
+ ++i和i++的效率问题(使用迭代器可能比使用指针更优:迭代器++i可以减少一次构造和析构)
|
||||||
+ 避免使用多重继承
|
+ 避免使用多重继承
|
||||||
+ 低级代码使用位运算替代算术运算
|
+ 低级代码使用位运算替代算术运算
|
||||||
+ 使用编译器自带的优化选项
|
|
||||||
+ 将小粒度函数声明为内联函数(inline)
|
+ 将小粒度函数声明为内联函数(inline)
|
||||||
+ 循环内定义,还是循环外定义对象:由构造函数和复制操作的效率比较决定
|
+ 循环内定义,还是循环外定义对象:由构造函数和复制操作的效率比较决定
|
||||||
+ 小函数放在同一循环内效率高,大函数分开放效率更高(由cpu寄存器决定)
|
+ 小函数放在同一循环内效率高,大函数分开放效率更高(由cpu寄存器决定)
|
||||||
+ 尽量少使用`dynamic_cast`
|
+ 尽量少使用`dynamic_cast`
|
||||||
+ 减少除法运算的使用,除数尽量使用常量,让编译器优化
|
+ 减少除法运算的使用,除数尽量使用常量,让编译器优化
|
||||||
+ 多用直接初始化
|
+ 多用直接初始化
|
||||||
+ 循环展开加速
|
|
||||||
|
@ -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) //交换两个类型相同的变量
|
|
||||||
```
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -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` 查看
|
|
||||||
|
@ -2,17 +2,17 @@
|
|||||||
`.` 重复上一个操作
|
`.` 重复上一个操作
|
||||||
|
|
||||||
## 目录
|
## 目录
|
||||||
- [录制宏](# 录制宏)
|
- [录制宏](#录制宏)
|
||||||
- [打开终端](# 打开终端)
|
- [打开终端](#打开终端)
|
||||||
- [快捷键](# 快捷键)
|
- [快捷键](#快捷键)
|
||||||
- [移动](# 移动)
|
- [移动](#移动)
|
||||||
- [插入](# 插入)
|
- [插入](#插入)
|
||||||
- [修改](# 修改)
|
- [修改](#修改)
|
||||||
- [删除](# 删除)
|
- [删除](#删除)
|
||||||
- [复制](# 复制)
|
- [复制](#复制)
|
||||||
- [基本补全](# 基本补全)
|
- [基本补全](#基本补全)
|
||||||
- [补全菜单](# 补全菜单)
|
- [补全菜单](#补全菜单)
|
||||||
- [vimrc](# ./.vimrc)
|
- [vimrc](#./.vimrc)
|
||||||
|
|
||||||
## 录制宏
|
## 录制宏
|
||||||
使用 q[Key] 开始录制宏,再次点击q结束录制
|
使用 q[Key] 开始录制宏,再次点击q结束录制
|
||||||
|
Loading…
x
Reference in New Issue
Block a user