日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Ubuntu怎么用c/c++编程

發(fā)布時間:2025/6/17 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ubuntu怎么用c/c++编程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

https://jingyan.baidu.com/article/48b37f8d23a2a61a646488db.html

··································································

在Ubuntu下搭建C/C++編程環(huán)境


在Ubuntu下搭建C/C++編程環(huán)境,綜合起來說就是vim+gcc+gdb。其中vim用于文本編輯,gcc用于程序編譯,gdb用于代碼調(diào)試。

要安裝編程環(huán)境,在Terminal中執(zhí)行sudo apt-get install build-essential。

桌面系統(tǒng)的快捷鍵

如果不用桌面系統(tǒng),可以關(guān)閉。
打開Terminal的快捷鍵是Ctrl+Alt+T,使用快捷鍵Ctrl+Super+Up最大化,Alt+F4關(guān)閉。
使用快捷鍵Alt+Tab切換窗口。
長按Super鍵(默認(rèn)為Windows鍵),可以看到關(guān)于桌面的所有快捷鍵。


Terminal的一些基本命令



一般最常用的是cd, ls, mkdir, rmdir, cp, rm, mv, clear, pwd, shutdown.
一般使用時只需記住常用命令,不清楚的時候用man查詢。如需查看更多命令可以閱讀《The Linux Command Line》(《Linux命令行大全》)。


編輯

不去管vim與Emacs的世紀(jì)之爭,vim真的是很強大的編輯器,擺脫對圖形界面的依賴,效率會有很大提高。vim有無窮盡的插件,善加選擇利用,有很多針對編程的快捷功能是vs也提供不了的。
vim的學(xué)習(xí)曲線雖然有些陡峭,但還是很值得的。
網(wǎng)上有很多學(xué)習(xí)Vim的資源,推薦幾本書:《Vim用戶手冊中文版7.3》《A Byte of Vim》《Practical Vim》,還有這個視頻教程(需要翻墻)。
使用vim,一般只需動用肌肉“記住”一些常用操作(如下表),其余功能用的時候查詢即可。

vim入門

vim入門主要是熟練使用基本命令。最直接的學(xué)習(xí)資源是在Terminal里輸入vimtutor,會有一個差不多30分鐘的入門教程。
或者學(xué)習(xí)上文提到的書籍和視頻,對常見命令均有講解。
推薦直接從官方文檔或是書籍入手,比在網(wǎng)上搜來搜去只鱗片爪有效率的多。四處搜索別人的學(xué)習(xí)經(jīng)驗,出發(fā)點是少走彎路,結(jié)果反而欲速則不達(dá),還不如沉下心好好看完一本書。
有幾張不同角度的cheat sheet,方便查閱。作者見文末參考鏈接。




在vim中,獲得幫助的命令是:help。
如果不知道自己想查什么,可以運行:help user-manual查看整個用戶手冊的目錄。
如果大概知道想使用的功能而不知道具體命令,可以使用:helpgrep在整個文檔中搜索相關(guān)內(nèi)容。比如想了解如何查看詞首,可以運行:helpgrep beginning of a word。可以使用:cnext和:cprev在搜索結(jié)果間跳轉(zhuǎn)。
更多關(guān)于幫助的幫助,參看《A Byte of Vim》中Vim en:Help這一節(jié)。

vim自定義配置

基本操作熟練之后,多半都會開始安插件折騰自定義配置。
自定義配置與插件包括vimrc、global plugin、filetype plugin、syntax highlighting plugin、compiler plugin。
一般將簡單配置記錄在vimrc文件里,高級功能使用插件來實現(xiàn)。

在Linux系統(tǒng)中,vimrc文件地址是$HOME/.vimrc。vim安裝時自帶的插件在$VIMRUNTIME/plugin/目錄下。自定義插件放在$HOME/.vim/plugin/的相應(yīng)子目錄下,且需在vimrc文件里設(shè)置自動加載此插件。
詳細(xì)的配置與插件使用及編寫請參看《A Byte of Vim》中Vim en:Plugins這一節(jié)。

偷了個懶,在github上發(fā)現(xiàn)一個很棒的配置方案spf13-vim,就直接安上了。
spf13-vim是運行在vim層之上,為方便編程,對vimrc和plugin都做了很多特殊優(yōu)化配置的一個工具。
spf13-vim。安裝很容易,根據(jù)readme上的指示進(jìn)行即可。

安裝成功后,可以打開~/.vimrc看到spf13-vim的預(yù)置配置。創(chuàng)建~/.vimrc.local和~/.gvimrc.local進(jìn)行自定義配置。
spf13-vim已經(jīng)預(yù)置了很多插件,關(guān)于這些插件的啟動和使用可以看spf13-vim的介紹和這些插件自己的github頁面。此處唯一提醒的一點是<leader>鍵在spf13-vim這里是逗號,。
我目前也在摸索中,有心得會隨時更新。這是我的操作速查表。

在Quora上看到有些人并不推薦使用spf13等工具,認(rèn)為會引誘你學(xué)習(xí)這個工具的配置方式,而不是真正學(xué)習(xí)vim的配置文件,使用自定義的針對自己需求的配置文件才最符合vim精神。不過對于初學(xué)者來說,我覺得spf13-vim還是很有價值的,畢竟時間這么寶貴,折騰是很累人的。


編譯運行

gcc

GCC(GNU Compiler Collection)是一組編譯工具的總稱,支持多平臺、多語言源文件到可執(zhí)行文件的編譯與生成。其中也包括gcc(C編譯器)和g++(C++編譯器)。
推薦書籍《An Introduction to GCC》。
在GCC內(nèi)部尋找?guī)椭?#xff0c;使用gcc --help,如果想看gcc選項的完整列表使用gcc -v --help 2>&1 | more。
最簡單的應(yīng)用示例:一個hello.cpp文件。一下語句就是編譯與運行。

1 2 g++ hello.cpp hello ./hello

gcc常用命令

基本語法格式如下。
對于C:gcc [options] [filenames]
對于C++:g++ [options] [filenames]
上述命令行按編譯選項(options)指定的操作對給定的文件(filenames)進(jìn)行編譯處理。

選項主要列表如下。

選項 選項描述
-c 只對文件進(jìn)行編譯和匯編,但不進(jìn)行連接,生成目標(biāo)文件”.o”
-S 只對文件進(jìn)行編譯,但不匯編和連接
-E 只對文件進(jìn)行預(yù)處理,但不編譯匯編和連接
-g 在可執(zhí)行程序中包含標(biāo)準(zhǔn)調(diào)試信息
-o file1 [file2] 將文件file1編譯成可執(zhí)行文件file2
-v 打印出編譯器內(nèi)部編譯各過程的命令行信息和編譯器的版本
-I dir 在頭文件的搜索路徑列表中添加dir目錄
-L dir 在庫文件的搜索路徑列表中添加dir目錄
-static 強制鏈接靜態(tài)庫
-lNAME 連接名為libNAME的庫文件
-Wall -W 開啟GCC最常用的警告,GCC的warning一般格式為file:line-number:message
-pedantic 要求嚴(yán)格符合ANSI標(biāo)準(zhǔn)
-Wconversion 開啟隱式類型轉(zhuǎn)換警告
-Wshadow 開啟同名變量函數(shù)警告
-Wcast-qual 開啟對特性移除的cast的警告,如const
-O(-O1) 對編譯出的代碼進(jìn)行優(yōu)化
-O2 進(jìn)行比-O高一級的優(yōu)化
-O3 產(chǎn)生更高級別的優(yōu)化
-Os 產(chǎn)生最小的可執(zhí)行文件
-pg 開啟性能測試,記錄每個函數(shù)的調(diào)用次數(shù)與時長
-ftest-coverage 記錄每一行被執(zhí)行的次數(shù)
-fprofile-arcs 記錄每個分支語句執(zhí)行的頻率

注意選項的大小寫。只在最后發(fā)行版時再使用優(yōu)化。即使在最后發(fā)行版也應(yīng)該加上-g選項。

幾種情境

以c++為例。
編譯單個文件為可執(zhí)行文件:

g++ -Wall -W hello.cpp -o hello

編譯多個文件為可執(zhí)行文件:

g++ -Wall -W main.cpp hello_fun.cpp -o newhello

編譯單個文件為可執(zhí)行文件,連接靜態(tài)庫static library:

系統(tǒng)默認(rèn)庫文件在目錄/usr/lib和/lib,還會自動搜索/usr/local/lib/和/usr/lib/。
相應(yīng)的,系統(tǒng)默認(rèn)頭文件在目錄,會自動搜索/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,連接系統(tǒng)自動搜索庫目錄里的庫文件。注意g++優(yōu)先使用shared library。如果找到同名.so就不會用同名.a。所以如果需要強制使用.a文件的話,應(yīng)使用-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。.表示當(dāng)前目錄。
  • 或使用環(huán)境變量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

編譯單個文件為可執(zhí)行文件,連接共享庫shared library:

如果只是用了系統(tǒng)默認(rèn)庫,g++ -Wall -W calc.cpp -lm -o calc
除了前文系統(tǒng)自動搜索庫文件目錄之外,如果要添加其他共享庫目錄,必須在環(huán)境變量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可以查看該可執(zhí)行文件依賴哪些.so。

編譯多個文件為靜態(tài)庫文件.a:

將多個.o文件集合為一個靜態(tài)庫文件.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表示編譯為位置獨立的代碼。

預(yù)處理

可以用gcc選項定義宏,-DNAME會定義一個名為NAME的宏。如g++ -Wall -DTEST dtest.cpp,定義了名為TEST的宏。定義的宏會對代碼產(chǎn)生影響。
也可以為宏定義值,-DNAME=VALUE。如g++ -Wall -DNUM=100 dtestval.cpp,g++ -Wall -DNUM="2+2" dtestval.cpp,g++ -Wall -DMESSAGE="\"Hello,World!\"" dteststr.cpp。在代碼中把宏用括號括起來是好習(xí)慣。

性能

開啟-pg選項生成可執(zhí)行文件后。首先正常運行一次可執(zhí)行文件./hello,然后運行g(shù)prof hello查看數(shù)據(jù)。
開啟-fprofile-arcs -ftest-coverage選項生成可執(zhí)行文件后。首先正常運行一次可執(zhí)行文件./hello,然后運行g(shù)cov hello.cpp查看數(shù)據(jù)。未被執(zhí)行的語句會在.gcov文件中標(biāo)記上-,可以通過執(zhí)行g(shù)rep '-' *.gcov查找未被執(zhí)行的語句。

makefile文件

對于較大的工程,如果還像前文一樣寫命令行就太痛苦了。而使用makefile可以管理整個工程的編譯規(guī)則,之后用一個make命令就可自動編譯,相對方便很多。

推薦書籍《跟我一起寫Makefile》和官方文檔。內(nèi)容看起來還是很晦澀…(?-?*)還好現(xiàn)在有了自動化工具,用來自動生成的工具也可以用工具自動生成了。

最基礎(chǔ)的用法

makefile基本規(guī)則是:

target1 target2 target3: prerequisite1 prerequisite2
command1
command2

其中target是目標(biāo)文件。prerequisites是要生成target所需文件或目標(biāo)。command是make需要執(zhí)行的命令。規(guī)則表示了一個文件的依賴關(guān)系,即target依賴于prerequisites,生成規(guī)則為command。如果target不存在或prerequisites中至少一個文件比target新的話,command定義的命令就會執(zhí)行。這就是makefile中最核心的內(nèi)容。

make工作的流程是:
當(dāng)我們輸入make命令之后,

  • 讀入所有的makefile文件。
  • 讀入被include包括的其他makefile文件。
  • 初始化文件中的變量。
  • 推導(dǎo)隱式規(guī)則,分析所有規(guī)則。
  • 為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈。
  • 根據(jù)依賴關(guān)系,決定哪些目標(biāo)要重新生成。
  • 執(zhí)行生成命令。
  • makefile文件名應(yīng)為Makefile或makefile。

    小示例

    我為自己刷題的一個小項目寫了一個將幾個目錄下所有的源文件一起編譯的一個makefile。在這里看工程的目錄結(jié)構(gòu)。

    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)

    網(wǎng)上看到一個Generic Makefile for C/C++ Program。

    使用CMake自動生成makefile

    當(dāng)處理較大型的項目時,手動書寫makefile就比較痛苦,這時用來用來自動化自動化工具makefile的自動化工具就是CMake。不過天下哪有那么便宜的事,它也是要寫自己的CMakeLists.txt的。
    推薦書籍《CMake實踐》《Mastering CMake》和官網(wǎng)幫助。

    簡介

    CMake是一個跨平臺的自動化建構(gòu)系統(tǒng),它是用一個名為CMakeLists.txt的文件來描述構(gòu)建過程,可以產(chǎn)生標(biāo)準(zhǔn)的構(gòu)建文件,如Unix的makefile或Windows Visual Studio的projects/workspaces。
    文件CMakeLists.txt需要手工編寫,也可以通過編寫腳本進(jìn)行半自動的生成。

    在Linux平臺下使用CMake生成makefile并編譯的流程如下:

  • 安裝CMake。在Ubuntu上安裝cmake很簡單$sudo apt-get install cmake。如果想要其Qt圖形界面另需安裝sudo apt-get install cmake-qt-gui。一般不需要,在Ubuntu系統(tǒng)上用ccmake就可以了。
  • 編寫CMakeLists.txt。
  • 運行CMake。用cd將當(dāng)前目錄設(shè)為生成目標(biāo)目錄,執(zhí)行命令ccmake srcdir(文字界面)或cmake -i(交互命令行),如果想使用Qt圖形界面使用cmake-gui。
  • Makefile已經(jīng)生成。使用make命令進(jìn)行編譯。
  • 如果想清理工程。使用make clean。
  • 簡單語法
    注釋:#
    命令語法:COMMAND(參數(shù)1 參數(shù)2 ...)
    字符串列表:A;B;C或A B C。分號或空格分隔的值。
    變量(字符串或字符串列表):

    set(Foo a b c)設(shè)置變量Foo。
    command(${Foo})等價于command(a b c)。
    command("${Foo}")等價于command("a b c")。
    command("/${Foo}")轉(zhuǎn)義,和a b c無關(guān)聯(lián)。

    流控制結(jié)構(gòu):

    IF()...ELSE()/ELSEIF()...ENDIF()
    WHILE()...ENDWHILE()
    FOREACH()...ENDFOREACH()

    正則表達(dá)式:

    常用命令總結(jié)

    命令 意義
    INCLUDE_DIRECTORIES( “dir1” “dir2” … ) 頭文件路徑,相當(dāng)于編譯器參數(shù) -Idir1 -Idir2
    AUX_SOURCE_DIRECTORY( “sourcedir” variable) 收集目錄中的文件名并賦值給變量
    ADD_EXECUTABLE 可執(zhí)行程序目標(biāo)
    ADD_LIBRARY 庫目標(biāo)
    ADD_CUSTOM_TARGET 自定義目標(biāo)
    ADD_DEPENDENCIES( target1 t2 t3 ) 目標(biāo)target1依賴于t2 t3
    ADD_DEFINITIONS( “-Wall -ansi”) 本意是供設(shè)置 -D… /D… 等編譯預(yù)處理需要的宏定義參數(shù),對比 REMOVE_DEFINITIONS()
    TARGET_LINK_LIBRARIES( target-name lib1 lib2 …) 設(shè)置單個目標(biāo)需要鏈接的庫
    LINK_LIBRARIES( lib1 lib2 …) 設(shè)置所有目標(biāo)需要鏈接的庫
    SET_TARGET_PROPERTIES( … ) 設(shè)置目標(biāo)的屬性 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 ) 轉(zhuǎn)換空格分隔的字符串到列表
    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] ) 執(zhí)行外部程序
    OPTION( OPTION_VAR “description” [initial value] )

    變量
    工程路徑

    CMAKE_SOURCE_DIR?PROJECT_SOURCE_DIR?<projectname>_SOURCE_DIR表示工程頂層目錄。
    CMAKE_BINARY_DIR?PROJECT_BINARY_DIR?<projectname>_BINARY_DIR表示生成目標(biāo)目錄。
    CMAKE_CURRENT_SOURCE_DIR表示當(dāng)前處理的CMakeLists.txt所在的目錄。
    CMAKE_CURRRENT_BINARY_DIR表示當(dāng)前處理的CMakeLists.txt的目標(biāo)目錄。
    CMAKE_CURRENT_LIST_FILE輸出調(diào)用這個變量的CMakeLists.txt的完整路徑。

    Debug和Release模式的構(gòu)建

    在CMakeList.txt文件中使用SET(CMAKE_BUILD_TYPE Debug)。
    或命令行參數(shù)cmake DCMAKE_BUILD_TYPE=Release。

    編譯器參數(shù)

    CMAKE_C_FLAGS?CMAKE_CXX_FLAGS
    也可以通過指令A(yù)DD_DEFINITIONS()添加。

    包含路徑

    CMAKE_INCLUDE_PATH配合FIND_FILE()以及FIND_PATH()使用。如果頭文件沒有存放在常規(guī)路徑(/usr/include, /usr/local/include等),則可以通過這些變量就行彌補。如果不使用FIND_FILE和FIND_PATH的話,CMAKE_INCLUDE_PATH沒有任何作用。
    CMAKE_LIBRARY_PATH配合配合FIND_LIBRARY()使用。否則沒有任何作用。
    CMAKE_MODULE_PATHCMake為上百個軟件包提供了查找器(finder):FindXXXX.cmake。當(dāng)使用非CMake自帶的finder時,需要指定finder的路徑,這就是CMAKE_MODULE_PATH,配合FIND_PACKAGE()使用。

    編寫CMakeLists.txt的示例

    對于如下的目錄結(jié)構(gòu)。

    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/

    多文件夾編譯(手動)

    將所有子文件夾中的源文件包含進(jìn)來,然后生成。

    在頂文件夾中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})

    另一種多文件夾編譯(自動)

    也是將所有子文件夾中符合后綴的文件自動包含進(jìn)來,然后生成。

    在頂文件夾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})

    多文件夾使用靜態(tài)庫

    將thirdparty中的文件編譯為一個靜態(tài)庫,由src中的另一個源文件在生成可執(zhí)行文件時調(diào)用。

    在頂文件夾中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")

    多文件夾使用動態(tài)庫

    將thirdparty中的文件編譯為一個動態(tài)庫,由src中的另一個源文件在生成可執(zhí)行文件時調(diào)用。
    與之前靜態(tài)庫的區(qū)別是add_library時的參數(shù),和兼顧平臺的部分。

    thirdparty目錄中的hello.h文件添加WIN32平臺的導(dǎo)入導(dǎo)出設(shè)置:

    1 2 3 4 5 6 7 8 9 10 11 12 13 #include <iostream> #include <string> using namespace std; #if defined _WIN32 #if LIBBUILD #define LIBHI_API __declspec(dllexport) #else #define LIBHI_API __declspec(dllimport) #endif #else #define LIBHI_API #endif 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")

    查找并使用其他程序庫?為VS生成debug和release版

    使用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生成時,圖形界面會出現(xiàn)CMAKE_BUILD_TYPE的選項。根據(jù)不同選擇會生成不同結(jié)果。


    調(diào)試

    gdb

    gdb是一個用來調(diào)試C和C++程序的功能強大的調(diào)試器,能在程序運行時觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存使用情況。
    gdb主要提供以下功能:

    • 監(jiān)視程序中變量的值的變化。
    • 設(shè)置斷點,使程序在指定的代碼行上暫停執(zhí)行,便于觀察。
    • 單步執(zhí)行代碼。
    • 分析崩潰程序產(chǎn)生的core文件。

    推薦書籍《Debugging with GDB》[在線][下載pdf]。通過在gdb下輸入help或在命令行上輸入gdb h查看關(guān)于gdb選項說明的簡單列表。鍵入help后跟命令的分類名。可以獲得該類命令的詳細(xì)清單。搜索和word相關(guān)的命令可用apropos word。

    為使gdb能正常工作,必須在程序編譯時包含調(diào)試信息。即-g選項。前文有講解。

    簡單的調(diào)試步驟示例

  • 載入test可執(zhí)行文件gdb test --silent。
  • 運行run。
  • 查看程序出錯的地方where。
  • 查看出錯函數(shù)附近的代碼list。
  • 打開堆棧backtrace。
  • 單步調(diào)節(jié)next或step。
  • 查看可疑表達(dá)式值print var。
  • 在可疑行打斷點break 8。
  • 重新運行會在斷點處停止。用set variable修改變量值。
  • 繼續(xù)運行continue。看結(jié)果是否正確。
  • 退出gdbquit。
  • 常用命令介紹

    Valgrind

    Valgrind是一個工具集,其中最著名的就是可以檢查內(nèi)存泄露的Memcheck。
    在ubuntu上安裝Valgrind的命令sudo apt-get install valgrind。
    與gdb的要求相同,程序編譯時需要有-g參數(shù)。
    對于平時用myprog arg1 arg2啟動的可執(zhí)行文件,使用valgrind --leak-check=yes myprog arg1 arg2就可以開啟內(nèi)存檢查,如果有錯誤會輸出。

    Valgrind命令的一般格式為valgrind [valgrind-options] your-prog [your-prog-options]。
    --tool=<toolname>可以選擇當(dāng)前運行的工具,默認(rèn)即為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環(huán)境編程
    [12] Linux C編程一站式學(xué)習(xí)
    [13] Linux環(huán)境下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調(diào)試程序
    [22] GDB調(diào)試命令手冊
    [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

    總結(jié)

    以上是生活随笔為你收集整理的Ubuntu怎么用c/c++编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。