vault backup: 2022-09-27 10:15:11

Affected files:
.obsidian/workspace
01. 個人/02. 專注Study/C++/GCC.md
attachments/Pasted image 20220926212505.png
attachments/Pasted image 20220926212522.png
This commit is contained in:
2022-09-27 10:15:12 +08:00
parent 65ea73f46b
commit 12cd61a862
4 changed files with 191 additions and 6 deletions

10
.obsidian/workspace vendored
View File

@@ -9,7 +9,7 @@
"state": {
"type": "markdown",
"state": {
"file": "01. 個人/02. 專注Study/C++/GCC.md",
"file": "00. Inbox/00. TODO.md",
"mode": "source",
"source": true
}
@@ -69,7 +69,7 @@
"state": {
"type": "backlink",
"state": {
"file": "01. 個人/02. 專注Study/C++/GCC.md",
"file": "00. Inbox/00. TODO.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
@@ -86,7 +86,7 @@
"state": {
"type": "outline",
"state": {
"file": "01. 個人/02. 專注Study/C++/GCC.md"
"file": "00. Inbox/00. TODO.md"
}
}
}
@@ -116,6 +116,7 @@
},
"active": "828beb43bb437dd1",
"lastOpenFiles": [
"01. 個人/02. 專注Study/C++/GCC.md",
"00. Inbox/00. TODO.md",
"03. 資料收集/讀書筆記/20201224 - 寫作是最好的自我投資.md",
"03. 資料收集/名言佳句.md",
@@ -124,7 +125,6 @@
"03. 資料收集/翻牆/V2Ray.md",
"02. 工作/01. Logitech/20210412 - TestCam.md",
"02. 工作/01. Logitech/20210428 - Sega.md",
"02. 工作/01. Logitech/20210512 - Kong.md",
"02. 工作/01. Logitech/20210716 - AutoStation.md"
"02. 工作/01. Logitech/20210512 - Kong.md"
]
}

View File

@@ -86,4 +86,189 @@ GCC在鏈接時優先使用動態庫只有當動態庫不存在時才開始
### 靜態庫鏈接時,搜索庫文件路徑的順序
1. `ld`會去找GCC命令中的參數`-L`
2. gcc的環境變量`LIBRARY_PATH`
3. `/lib``/usr/lib``/usr/local/lib`等寫在程序內的路徑
3. `/lib``/usr/lib``/usr/local/lib`等寫在程序內的路徑
### 動態庫鏈接時,搜索庫文件路徑的順序
1. 編譯目標代碼時指定的動態庫搜索路徑
2. gcc的環境變量`LD_LIBRARY_PATH`
3. 配置文件`/etc/ld.so.conf`中指定的動態庫搜索路徑
4. 默認的動態庫搜索路徑`/lib`
5. 默認的動態庫搜索路徑`/usr/lib`
## 實用的工具
### ldd
列出依賴的動態庫
![[Pasted image 20220926212505.png]]
### nm
查看動態庫/靜態庫中的函數
![[Pasted image 20220926212522.png]]
## gcc/g++命令常見參數
命令格式
```bash
gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...
```
在linux環境使用`man g++`可以查看g++命令常用參數
### 常見參數如下(注意大小寫):
```bash
-o
#输出到指定文件。如果不指定默认输出到a.out
-E
#仅进行预处理,不进行编译、汇编和链接
-S
#将代码转换为文件格式为xxx.s的汇编语言文件但不进行汇编
-c
#仅进行编译和汇编不进行链接操作常用于编译不包含main程序的子程序代码
-v
#打印gcc编译时的详细步骤信息
复制代码
```
### 編譯和路徑參數
```bash
-l[basic library]
#编译时指定要使用的基础库,样例:-lpthread针对Posix线程共享库进行编译
-L[shared-library path]
#共享库的路径添加到搜索的范围路径为包含xxx.dll/xxx.so/xxx.dlyb文件的目录
-I[include header-file path]
#将头文件的路径添加到搜索的范围路径为包含xxx.h/xxx.hpp文件的目录
-shared
#生成共享库库文件格式为xxx.dll/xxx.so/xxx.dlyb格式的文件
-static
#生成静态库库文件格式为xxx.a格式的文件
-Wl
#告诉编译器将后面的参数传递给链接器
-Wl,-Bstatic
#-Bstatic选项用于对指定的库静态连接
-Wl,-Bdynamic
#-Bdynamic搜索共享库默认
-Wa,option
#此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序
-Wl,option
#此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序
复制代码
```
### 預處理參數
```bash
#使用形式:-D[FLAG] 或-D[FLAG]=VALUE
-Dmacro
#在命令行里定义宏相当于C语言中的"#define macro"
-Umacro
#相当于C语言中的"#undef macro"
-undef
#取消对任何非标准宏的定义
复制代码
```
### 警告與報錯參數
```bash
-Wall
#发出gcc提供的所有有用的报警信息
-Werror
#将警告升级为编译报错
-Wextra / -W
#启用-Wall未启用的额外警告位对合法但值得怀疑的代码发出警告 例如 -Wsign-compare
-pendantic / -Wpendantic
#发出ISO C和ISO C++标准列出的所有警告,用于语法检查,-pedantic-erros的用法也类似
-fsyntax-only
#仅做语法检查
复制代码
```
### 調試參數
```bash
-g
#产生带有调试信息的目标代码
-gstabs
#此选项以stabs格式声称调试信息,但是不包括gdb调试信息
-gstabs+
#此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息
-ggdb
#生成gdb专用的调试信息
-glevel
#请求生成调试信息同时用level指出需要多少信息默认的level值是2
复制代码
```
### 編碼配置參數
```bash
-fno-exceptions
#屏蔽掉C++的异常,常用于于嵌入式或无法接受异常的系统
-fno-rtti
#禁用RTTI常用于嵌入式或游戏开发
-fno-asm
#不要识别asm,inline或typeof作为关键字以便代码可以使用这些词作为标识符。您可以使用关键字__asm__,__inline__来__typeof__ 代替。 -ansi暗示-fno-asm
-fPIC / -fpic
#让编译器的代码和位置无关,让代码逻辑不使用绝对地址,只用相对地址,方便文件加载
-nostdinc
#使编译器不再系统默认的头文件目录里面找头文件, 一般和 -I 联合使用,明确限定头文件的位置
-nostdin C++
#规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建libg++库使用
复制代码
```
### 優化參數
```bash
-O0
#不优化
-O1 / -O
#尝试优化编译时间和可执行文件大小
-O2
#尝试所有的优化选项,但不会进行“空间换时间”的优化方式
-Os
#尝试所有的优化选项时,优先优化可执行文件大小
复制代码
```
## 來源
- [C/C++生態工具鏈——gcc/g++編譯器使用指南- 掘金](https://juejin.cn/post/7143280156042330125)
## 參考
- [Top (Using the GNU Compiler Collection (GCC))](https://gcc.gnu.org/onlinedocs/gcc/)
- [The C++ Compilation Model | C++ Fundamentals](https://subscription.packtpub.com/book/programming/9781789801491/1/ch01lvl1sec03/the-c-compilation-model)
- [What is LD_LIBRARY_PATH used for?](https://linuxhint.com/what-is-ld-library-path/)

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB