diff --git a/.obsidian/workspace b/.obsidian/workspace index 50690fa..982d1cd 100644 --- a/.obsidian/workspace +++ b/.obsidian/workspace @@ -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" ] } \ No newline at end of file diff --git a/01. 個人/02. 專注Study/C++/GCC.md b/01. 個人/02. 專注Study/C++/GCC.md index e5e12ae..368a08d 100644 --- a/01. 個人/02. 專注Study/C++/GCC.md +++ b/01. 個人/02. 專注Study/C++/GCC.md @@ -86,4 +86,189 @@ GCC在鏈接時優先使用動態庫,只有當動態庫不存在時才開始 ### 靜態庫鏈接時,搜索庫文件路徑的順序 1. `ld`會去找GCC命令中的參數`-L` 2. gcc的環境變量`LIBRARY_PATH` -3. `/lib`,`/usr/lib`,`/usr/local/lib`等寫在程序內的路徑 \ No newline at end of file +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/) \ No newline at end of file diff --git a/attachments/Pasted image 20220926212505.png b/attachments/Pasted image 20220926212505.png new file mode 100644 index 0000000..3435b5b Binary files /dev/null and b/attachments/Pasted image 20220926212505.png differ diff --git a/attachments/Pasted image 20220926212522.png b/attachments/Pasted image 20220926212522.png new file mode 100644 index 0000000..198319e Binary files /dev/null and b/attachments/Pasted image 20220926212522.png differ