Ubuntu怎么用c/c++编程
https://jingyan.baidu.com/article/48b37f8d23a2a61a646488db.html
··································································
在Ubuntu下搭建C/C++編程環境
在Ubuntu下搭建C/C++編程環境,綜合起來說就是vim+gcc+gdb。其中vim用于文本編輯,gcc用于程序編譯,gdb用于代碼調試。
要安裝編程環境,在Terminal中執行sudo apt-get install build-essential。
桌面系統的快捷鍵
如果不用桌面系統,可以關閉。
打開Terminal的快捷鍵是Ctrl+Alt+T,使用快捷鍵Ctrl+Super+Up最大化,Alt+F4關閉。
使用快捷鍵Alt+Tab切換窗口。
長按Super鍵(默認為Windows鍵),可以看到關于桌面的所有快捷鍵。
Terminal的一些基本命令
一般最常用的是cd, ls, mkdir, rmdir, cp, rm, mv, clear, pwd, shutdown.
一般使用時只需記住常用命令,不清楚的時候用man查詢。如需查看更多命令可以閱讀《The Linux Command Line》(《Linux命令行大全》)。
編輯
不去管vim與Emacs的世紀之爭,vim真的是很強大的編輯器,擺脫對圖形界面的依賴,效率會有很大提高。vim有無窮盡的插件,善加選擇利用,有很多針對編程的快捷功能是vs也提供不了的。
vim的學習曲線雖然有些陡峭,但還是很值得的。
網上有很多學習Vim的資源,推薦幾本書:《Vim用戶手冊中文版7.3》《A Byte of Vim》《Practical Vim》,還有這個視頻教程(需要翻墻)。
使用vim,一般只需動用肌肉“記住”一些常用操作(如下表),其余功能用的時候查詢即可。
vim入門
vim入門主要是熟練使用基本命令。最直接的學習資源是在Terminal里輸入vimtutor,會有一個差不多30分鐘的入門教程。
或者學習上文提到的書籍和視頻,對常見命令均有講解。
推薦直接從官方文檔或是書籍入手,比在網上搜來搜去只鱗片爪有效率的多。四處搜索別人的學習經驗,出發點是少走彎路,結果反而欲速則不達,還不如沉下心好好看完一本書。
有幾張不同角度的cheat sheet,方便查閱。作者見文末參考鏈接。
在vim中,獲得幫助的命令是:help。
如果不知道自己想查什么,可以運行:help user-manual查看整個用戶手冊的目錄。
如果大概知道想使用的功能而不知道具體命令,可以使用:helpgrep在整個文檔中搜索相關內容。比如想了解如何查看詞首,可以運行:helpgrep beginning of a word。可以使用:cnext和:cprev在搜索結果間跳轉。
更多關于幫助的幫助,參看《A Byte of Vim》中Vim en:Help這一節。
vim自定義配置
基本操作熟練之后,多半都會開始安插件折騰自定義配置。
自定義配置與插件包括vimrc、global plugin、filetype plugin、syntax highlighting plugin、compiler plugin。
一般將簡單配置記錄在vimrc文件里,高級功能使用插件來實現。
在Linux系統中,vimrc文件地址是$HOME/.vimrc。vim安裝時自帶的插件在$VIMRUNTIME/plugin/目錄下。自定義插件放在$HOME/.vim/plugin/的相應子目錄下,且需在vimrc文件里設置自動加載此插件。
詳細的配置與插件使用及編寫請參看《A Byte of Vim》中Vim en:Plugins這一節。
偷了個懶,在github上發現一個很棒的配置方案spf13-vim,就直接安上了。
spf13-vim是運行在vim層之上,為方便編程,對vimrc和plugin都做了很多特殊優化配置的一個工具。
spf13-vim。安裝很容易,根據readme上的指示進行即可。
安裝成功后,可以打開~/.vimrc看到spf13-vim的預置配置。創建~/.vimrc.local和~/.gvimrc.local進行自定義配置。
spf13-vim已經預置了很多插件,關于這些插件的啟動和使用可以看spf13-vim的介紹和這些插件自己的github頁面。此處唯一提醒的一點是<leader>鍵在spf13-vim這里是逗號,。
我目前也在摸索中,有心得會隨時更新。這是我的操作速查表。
在Quora上看到有些人并不推薦使用spf13等工具,認為會引誘你學習這個工具的配置方式,而不是真正學習vim的配置文件,使用自定義的針對自己需求的配置文件才最符合vim精神。不過對于初學者來說,我覺得spf13-vim還是很有價值的,畢竟時間這么寶貴,折騰是很累人的。
編譯運行
gcc
GCC(GNU Compiler Collection)是一組編譯工具的總稱,支持多平臺、多語言源文件到可執行文件的編譯與生成。其中也包括gcc(C編譯器)和g++(C++編譯器)。
推薦書籍《An Introduction to GCC》。
在GCC內部尋找幫助,使用gcc --help,如果想看gcc選項的完整列表使用gcc -v --help 2>&1 | more。
最簡單的應用示例:一個hello.cpp文件。一下語句就是編譯與運行。
| 1 2 | g++ hello.cpp hello ./hello |
gcc常用命令
基本語法格式如下。
對于C:gcc [options] [filenames]
對于C++:g++ [options] [filenames]
上述命令行按編譯選項(options)指定的操作對給定的文件(filenames)進行編譯處理。
選項主要列表如下。
| -c | 只對文件進行編譯和匯編,但不進行連接,生成目標文件”.o” |
| -S | 只對文件進行編譯,但不匯編和連接 |
| -E | 只對文件進行預處理,但不編譯匯編和連接 |
| -g | 在可執行程序中包含標準調試信息 |
| -o file1 [file2] | 將文件file1編譯成可執行文件file2 |
| -v | 打印出編譯器內部編譯各過程的命令行信息和編譯器的版本 |
| -I dir | 在頭文件的搜索路徑列表中添加dir目錄 |
| -L dir | 在庫文件的搜索路徑列表中添加dir目錄 |
| -static | 強制鏈接靜態庫 |
| -lNAME | 連接名為libNAME的庫文件 |
| -Wall -W | 開啟GCC最常用的警告,GCC的warning一般格式為file:line-number:message |
| -pedantic | 要求嚴格符合ANSI標準 |
| -Wconversion | 開啟隱式類型轉換警告 |
| -Wshadow | 開啟同名變量函數警告 |
| -Wcast-qual | 開啟對特性移除的cast的警告,如const |
| -O(-O1) | 對編譯出的代碼進行優化 |
| -O2 | 進行比-O高一級的優化 |
| -O3 | 產生更高級別的優化 |
| -Os | 產生最小的可執行文件 |
| -pg | 開啟性能測試,記錄每個函數的調用次數與時長 |
| -ftest-coverage | 記錄每一行被執行的次數 |
| -fprofile-arcs | 記錄每個分支語句執行的頻率 |
注意選項的大小寫。只在最后發行版時再使用優化。即使在最后發行版也應該加上-g選項。
幾種情境
以c++為例。
編譯單個文件為可執行文件:
g++ -Wall -W hello.cpp -o hello
編譯多個文件為可執行文件:
g++ -Wall -W main.cpp hello_fun.cpp -o newhello
編譯單個文件為可執行文件,連接靜態庫static library:
系統默認庫文件在目錄/usr/lib和/lib,還會自動搜索/usr/local/lib/和/usr/lib/。
相應的,系統默認頭文件在目錄,會自動搜索/usr/local/include/和/usr/include/。
顯式指定庫目錄與文件,g++ -Wall -W calc.cpp /usr/lib/libm.a -o calc
或更好的寫法g++ -Wall -W -static calc.cpp -lm -o calc,連接系統自動搜索庫目錄里的庫文件。注意g++優先使用shared library。如果找到同名.so就不會用同名.a。所以如果需要強制使用.a文件的話,應使用-static。
如果不在自動搜索的庫目錄,兩種方法。一般使用命令行這一種。
- 使用命令行-I添加搜索頭文件的目錄和-L添加搜索庫文件的目錄,例如g++ -Wall -W -static -I/code/test/include -I/code/another/include -I. -L/code/test/lib -L/code/another/lib -L. calc.cpp -ltest。.表示當前目錄。
- 或使用環境變量C_INCLUDE_PATH(C)或CPLUS_INCLUDE_PATH(C++)和LIBRARY_PATH。用如下語句添加搜索路徑,之后就可以使用g++ -Wall -W -static calc.cpp -ltest了。
1 2 3 4 CPLUS_INCLUDE_PATH = /code/test/include:/code/another/include:.:$CPLUS_INCLUDE_PATH export CPLUS_INCLUDE_PATH LIBRARY_PATH = /code/test/lib:/code/another/lib:.:$LIBRARY_PATH export LIBRARY_PATH
編譯單個文件為可執行文件,連接共享庫shared library:
如果只是用了系統默認庫,g++ -Wall -W calc.cpp -lm -o calc
除了前文系統自動搜索庫文件目錄之外,如果要添加其他共享庫目錄,必須在環境變量LD_LIBRARY_PATH中添加路徑。
| 1 2 | LD_LIBRARY_PATH = /code/test/lib:/code/another/lib:.:$LD_LIBRARY_PATH export LD_LIBRARY_PATH |
之后可以使用g++ -Wall -W calc.cpp /usr/lib/libm.so -o calc或g++ -Wall -W -I/code/test/include -I/code/another/include -I. -L/code/test/lib -L/code/another/lib -L. calc.cpp -ltest。
使用ldd calc可以查看該可執行文件依賴哪些.so。
編譯多個文件為靜態庫文件.a:
將多個.o文件集合為一個靜態庫文件.a。其中cr表示”create and replace”。
| 1 2 3 | g++ -Wall -c hello_fn.cpp g++ -Wall -c bye_fn.cpp ar cr libhello.a hello_fn.o bye_fn.o |
可以查看一個.a文件里包含哪些.o。使用ar t libhello.a。
編譯多個文件為共享庫文件.so:
g++ x.cpp y.cpp z.cpp -fPIC -shared -o libtest.so。其中-fPIC表示編譯為位置獨立的代碼。
預處理
可以用gcc選項定義宏,-DNAME會定義一個名為NAME的宏。如g++ -Wall -DTEST dtest.cpp,定義了名為TEST的宏。定義的宏會對代碼產生影響。
也可以為宏定義值,-DNAME=VALUE。如g++ -Wall -DNUM=100 dtestval.cpp,g++ -Wall -DNUM="2+2" dtestval.cpp,g++ -Wall -DMESSAGE="\"Hello,World!\"" dteststr.cpp。在代碼中把宏用括號括起來是好習慣。
性能
開啟-pg選項生成可執行文件后。首先正常運行一次可執行文件./hello,然后運行gprof hello查看數據。
開啟-fprofile-arcs -ftest-coverage選項生成可執行文件后。首先正常運行一次可執行文件./hello,然后運行gcov hello.cpp查看數據。未被執行的語句會在.gcov文件中標記上-,可以通過執行grep '-' *.gcov查找未被執行的語句。
makefile文件
對于較大的工程,如果還像前文一樣寫命令行就太痛苦了。而使用makefile可以管理整個工程的編譯規則,之后用一個make命令就可自動編譯,相對方便很多。
推薦書籍《跟我一起寫Makefile》和官方文檔。內容看起來還是很晦澀…(?-?*)還好現在有了自動化工具,用來自動生成的工具也可以用工具自動生成了。
最基礎的用法
makefile基本規則是:
target1 target2 target3: prerequisite1 prerequisite2
command1
command2
其中target是目標文件。prerequisites是要生成target所需文件或目標。command是make需要執行的命令。規則表示了一個文件的依賴關系,即target依賴于prerequisites,生成規則為command。如果target不存在或prerequisites中至少一個文件比target新的話,command定義的命令就會執行。這就是makefile中最核心的內容。
make工作的流程是:
當我們輸入make命令之后,
makefile文件名應為Makefile或makefile。
小示例
我為自己刷題的一個小項目寫了一個將幾個目錄下所有的源文件一起編譯的一個makefile。在這里看工程的目錄結構。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | EXEC = MyLeetCode SRC_DIR = ../../catch ../../include ../../src SOURCES := $(foreach x, ${SRC_DIR},\ $(wildcard \ $(addprefix ${x}/*,.cpp))) OBJECTS = $(SOURCES:.cpp=.o) CXX = g++ CXXFLAGS = -I../../catch -I../../include -I../../src -std=c++11 $(EXEC): $(OBJECTS) $(CXX) -o $@ $^ .PHONY : clean clean: $(RM) $(OBJECTS) $(RM) $(EXEC) |
網上看到一個Generic Makefile for C/C++ Program。
使用CMake自動生成makefile
當處理較大型的項目時,手動書寫makefile就比較痛苦,這時用來用來自動化自動化工具makefile的自動化工具就是CMake。不過天下哪有那么便宜的事,它也是要寫自己的CMakeLists.txt的。
推薦書籍《CMake實踐》《Mastering CMake》和官網幫助。
簡介
CMake是一個跨平臺的自動化建構系統,它是用一個名為CMakeLists.txt的文件來描述構建過程,可以產生標準的構建文件,如Unix的makefile或Windows Visual Studio的projects/workspaces。
文件CMakeLists.txt需要手工編寫,也可以通過編寫腳本進行半自動的生成。
在Linux平臺下使用CMake生成makefile并編譯的流程如下:
簡單語法
注釋:#
命令語法:COMMAND(參數1 參數2 ...)
字符串列表:A;B;C或A B C。分號或空格分隔的值。
變量(字符串或字符串列表):
set(Foo a b c)設置變量Foo。
command(${Foo})等價于command(a b c)。
command("${Foo}")等價于command("a b c")。
command("/${Foo}")轉義,和a b c無關聯。
流控制結構:
IF()...ELSE()/ELSEIF()...ENDIF()
WHILE()...ENDWHILE()
FOREACH()...ENDFOREACH()
正則表達式:
常用命令總結
| INCLUDE_DIRECTORIES( “dir1” “dir2” … ) | 頭文件路徑,相當于編譯器參數 -Idir1 -Idir2 |
| AUX_SOURCE_DIRECTORY( “sourcedir” variable) | 收集目錄中的文件名并賦值給變量 |
| ADD_EXECUTABLE | 可執行程序目標 |
| ADD_LIBRARY | 庫目標 |
| ADD_CUSTOM_TARGET | 自定義目標 |
| ADD_DEPENDENCIES( target1 t2 t3 ) | 目標target1依賴于t2 t3 |
| ADD_DEFINITIONS( “-Wall -ansi”) | 本意是供設置 -D… /D… 等編譯預處理需要的宏定義參數,對比 REMOVE_DEFINITIONS() |
| TARGET_LINK_LIBRARIES( target-name lib1 lib2 …) | 設置單個目標需要鏈接的庫 |
| LINK_LIBRARIES( lib1 lib2 …) | 設置所有目標需要鏈接的庫 |
| SET_TARGET_PROPERTIES( … ) | 設置目標的屬性 OUTPUT_NAME, VERSION, …. |
| MESSAGE(…) | 這個指令用于向終端輸出用戶定義的信息 |
| INSTALL( FILES “f1” “f2”DESTINATION . ) | DESTINATION 相對于 ${CMAKE_INSTALL_PREFIX} |
| SET( VAR value [CACHE TYPE DOCSTRING [FORCE]]) | 定義與修改變量 |
| LIST( APPEND/INSERT/LENGTH/GET/REMOVE_ITEM/REMOVE_AT/SORT …) | 列表操作 |
| STRING( TOUPPER/TOLOWER/LENGTH/SUBSTRING/REPLACE/REGEX …) | 字符串操作 |
| SEPARATE_ARGUMENTS( VAR ) | 轉換空格分隔的字符串到列表 |
| FILE( WRITE/READ/APPEND/GLOB/GLOB_RECURSE/REMOVE/MAKE_DIRECTORY …) | 文件操作 |
| FIND_FILE | 注意 CMAKE_INCLUDE_PATH |
| FIND_PATH | 注意 CMAKE_INCLUDE_PATH |
| FIND_LIBRARY | 注意 CMAKE_LIBRARY_PATH |
| FIND_PROGRAM | ? |
| FIND_PACKAGE | 注意 CMAKE_MODULE_PATH |
| EXEC_PROGRAM( bin [work_dir] ARGS <..> [OUTPUT_VARIABLE var] [RETURN_VALUE var] ) | 執行外部程序 |
| OPTION( OPTION_VAR “description” [initial value] ) |
變量
工程路徑
CMAKE_SOURCE_DIR?PROJECT_SOURCE_DIR?<projectname>_SOURCE_DIR表示工程頂層目錄。
CMAKE_BINARY_DIR?PROJECT_BINARY_DIR?<projectname>_BINARY_DIR表示生成目標目錄。
CMAKE_CURRENT_SOURCE_DIR表示當前處理的CMakeLists.txt所在的目錄。
CMAKE_CURRRENT_BINARY_DIR表示當前處理的CMakeLists.txt的目標目錄。
CMAKE_CURRENT_LIST_FILE輸出調用這個變量的CMakeLists.txt的完整路徑。
Debug和Release模式的構建
在CMakeList.txt文件中使用SET(CMAKE_BUILD_TYPE Debug)。
或命令行參數cmake DCMAKE_BUILD_TYPE=Release。
編譯器參數
CMAKE_C_FLAGS?CMAKE_CXX_FLAGS
也可以通過指令ADD_DEFINITIONS()添加。
包含路徑
CMAKE_INCLUDE_PATH配合FIND_FILE()以及FIND_PATH()使用。如果頭文件沒有存放在常規路徑(/usr/include, /usr/local/include等),則可以通過這些變量就行彌補。如果不使用FIND_FILE和FIND_PATH的話,CMAKE_INCLUDE_PATH沒有任何作用。
CMAKE_LIBRARY_PATH配合配合FIND_LIBRARY()使用。否則沒有任何作用。
CMAKE_MODULE_PATHCMake為上百個軟件包提供了查找器(finder):FindXXXX.cmake。當使用非CMake自帶的finder時,需要指定finder的路徑,這就是CMAKE_MODULE_PATH,配合FIND_PACKAGE()使用。
編寫CMakeLists.txt的示例
對于如下的目錄結構。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | +example | +--- CMakeList.txt +--+ src/ | | | +--- main.cpp | /--- CMakeList.txt | +--+ thirdparty/ | | | +--- hello.h | +--- hello.cpp | /--- CMakeList.txt | /--+ build/ |
將所有子文件夾中的源文件包含進來,然后生成。
在頂文件夾中example的CMakeLists.txt中:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | cmake_minimum_required(VERSION 2.6) project(HELLO) # include src include(src/CMakeLists.txt) foreach(FILE ${FILES}) set(subdir1Files ${subdir1Files} src/${FILE}) endforeach(FILE) # include thirdparty include(thirdparty/CMakeLists.txt) foreach(FILE ${FILES}) set(subdir2Files ${subdir2Files} thirdparty/${FILE}) endforeach(FILE) # add the source files to the executable add_executable(hello ${subdir1Files} ${subdir2Files}) |
在src目錄的CMakeLists.txt中:
| 1 2 | # list the source files for this directory set (FILES main.cpp) |
在thirdparty目錄的CMakeLists.txt中:
| 1 2 | # list the source files for this directory set(FILES hello.h hello.cpp) |
和上一種方式一樣,只不過是自動包含。
在頂文件夾中example的CMakeLists.txt中:
| 1 2 3 4 5 | cmake_minimum_required(VERSION 2.6) project(HELLO) AUX_SOURCE_DIRECTORY(./thirdparty subdir1Files) AUX_SOURCE_DIRECTORY(./src subdir2Files) add_executable(hello ${subdir1Files} ${subdir2Files}) |
也是將所有子文件夾中符合后綴的文件自動包含進來,然后生成。
在頂文件夾example中的CMakeLists.txt中:
| 1 2 3 4 5 6 | cmake_minimum_required(VERSION 2.6) FILE(GLOB_RECURSE SRC_LIST "${PROJECT_SOURCE_DIR}/thirdparty/*.cpp" "${PROJECT_SOURCE_DIR}/src/*.cpp") FOREACH(src ${SRC_LIST}) MESSAGE(${src}) ENDFOREACH() add_executable(hello ${SRC_LIST}) |
將thirdparty中的文件編譯為一個靜態庫,由src中的另一個源文件在生成可執行文件時調用。
在頂文件夾中example的CMakeLists.txt中:
| 1 2 3 4 | cmake_minimum_required(VERSION 2.6) project(HELLO) add_subdirectory(src) add_subdirectory(thirdparty) |
在src目錄的CMakeLists.txt中:
| 1 2 3 4 5 | #include_directories(${PROJECT_SOURCE_DIR}/thirdparty) set(APP_SRC main.cpp) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) add_executable(hello ${APP_SRC}) target_link_libraries(hello hi) |
在thirdparty目錄的CMakeLists.txt中:
| 1 2 3 4 | set(LIB_SRC hello.cpp) add_library(hi ${LIB_SRC}) set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) set_target_properties(hi PROPERTIES OUTPUT_NAME "hi") |
將thirdparty中的文件編譯為一個動態庫,由src中的另一個源文件在生成可執行文件時調用。
與之前靜態庫的區別是add_library時的參數,和兼顧平臺的部分。
thirdparty目錄中的hello.h文件添加WIN32平臺的導入導出設置:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | using namespace std; LIBHI_API void say_hello(string str); |
在thirdparty目錄的CMakeLists.txt中:
| 1 2 3 4 5 | set(LIB_SRC hello.cpp) add_definitions("-DLIBBUILD") add_library(hi SHARED ${LIB_SRC}) set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) set_target_properties(hi PROPERTIES OUTPUT_NAME "hi") |
使用CMAKE_CXX_FLAGS_DEBUG和CMAKE_CXX_FLAGS_RELEASE。
以上文“多文件夾編譯(自動)”為例,頂文件夾中example的CMakeLists.txt修改為:
| 1 2 3 4 5 6 7 | cmake_minimum_required(VERSION 2.6) project(HELLO) SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") AUX_SOURCE_DIRECTORY(./thirdparty subdir1Files) AUX_SOURCE_DIRECTORY(./src subdir2Files) add_executable(hello ${subdir1Files} ${subdir2Files}) |
在用ccmake生成時,圖形界面會出現CMAKE_BUILD_TYPE的選項。根據不同選擇會生成不同結果。
調試
gdb
gdb是一個用來調試C和C++程序的功能強大的調試器,能在程序運行時觀察程序的內部結構和內存使用情況。
gdb主要提供以下功能:
- 監視程序中變量的值的變化。
- 設置斷點,使程序在指定的代碼行上暫停執行,便于觀察。
- 單步執行代碼。
- 分析崩潰程序產生的core文件。
推薦書籍《Debugging with GDB》[在線][下載pdf]。通過在gdb下輸入help或在命令行上輸入gdb h查看關于gdb選項說明的簡單列表。鍵入help后跟命令的分類名。可以獲得該類命令的詳細清單。搜索和word相關的命令可用apropos word。
為使gdb能正常工作,必須在程序編譯時包含調試信息。即-g選項。前文有講解。
簡單的調試步驟示例
常用命令介紹
Valgrind
Valgrind是一個工具集,其中最著名的就是可以檢查內存泄露的Memcheck。
在ubuntu上安裝Valgrind的命令sudo apt-get install valgrind。
與gdb的要求相同,程序編譯時需要有-g參數。
對于平時用myprog arg1 arg2啟動的可執行文件,使用valgrind --leak-check=yes myprog arg1 arg2就可以開啟內存檢查,如果有錯誤會輸出。
Valgrind命令的一般格式為valgrind [valgrind-options] your-prog [your-prog-options]。
--tool=<toolname>可以選擇當前運行的工具,默認即為memcheck。
--help顯示幫助。
[1]?http://www.viemu.com/
[2]?http://bbs.zol.com.cn/diybbs/d34450_19858.html
[3]?http://4gamers.cn/blog/2014/06/19/make-your-vim-weapon/
[4]?http://derekwyatt.org/vim/tutorials/
[5]?http://www.phecda.org
[6]?http://blog.vgod.tw/tag/mit/?variant=zh-cn
[7]?http://vim.spf13.com/#vimrc
[8]?http://ram.kossboss.com/spf13c/
[9] A Byte of Vim
[10]?http://michael.peopleofhonoronly.com/vim/
[11] Linux環境編程
[12] Linux C編程一站式學習
[13] Linux環境下C編程指南
[14] An Introduction to GCC
[15] 跟我一起寫Makefile
[16] Mastering CMake
[17]?http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/
[18]?http://blog.sina.com.cn/s/blog_9ce5a1b501015avz.html
[19]?http://blog.csdn.net/dbzhang800/article/details/6314073
[20]?http://blog.csdn.net/dbzhang800/article/details/6329068
[21] 用GDB調試程序
[22] GDB調試命令手冊
[23] Debugging with GDB
[24]?http://www.vingel.com/tools/reference/gdb-commands-list.png
[25]?https://wiki.ubuntu.com/Valgrind
[26]?http://valgrind.org/docs/manual/quick-start.html
[27]?http://valgrind.org/docs/manual/manual.html
總結
以上是生活随笔為你收集整理的Ubuntu怎么用c/c++编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用“Hash文件信息校验” 工具
- 下一篇: 英语单词 voltage simul