Linux 下C++開發入門指南,簡易入門版

Linux 下C++開發入門指南

                                Alan Luo 2017-01-13

本文目的是針對將熟悉C/C++語法,如何在Linux下進行的C/C++開發的入門指南。Linux下的開發和在Windows下的開發類似,主要區別點在於操作系統不同,開發工具,開發API,編譯調試方法不一樣,故主要將針對這些不同點進行闡述,使在Windows開發的程序員能夠入門Linux下C++ 開發的行列中。

一,涉及技術以及開發工具

1,工具

1.1 Linux環境

首先,你得有一臺Linux機器,目前的開發環境是10.88.115.114,機器需要安裝g++/gcc編譯器環境,文本編輯器,如vim等,一般安裝操作系統會安裝好,如果系統沒有需要自行安裝。

輸入g++ -v 查看本機是否安裝g++環境

安裝方式有兩種,YUM安裝和源代碼安裝方式。推薦使用YUM安裝方式。

Yum安裝可以自動解決庫依賴問題,所以推薦使用。YUM安裝g++:

yum list gcc-c++

yum install gcc-c++.i686

自動安裝即可。

另外開發過程中,需要調試,故Linux機器也需要安裝gdb調試工具。

Gdb安裝方式類似:

yum install gdb

1.2 Windows工具

Linux下的開發一般不是直接在Linux下進行開發,當然如何願意也是可以的,可以直接使用VIM進行開發。但是需要很長的時間熟練使用VIM的快捷鍵,對於入門開發來說過於困難,故直接在Windows下開發者居多。在Windows下開發Linux下應用主要使用的工具如下:

(1)Xshell,用於連接Linux主機,可以使用free for school版本,百度一下安裝即可

最後可以配置成如下簡潔界面,讓人感覺輕鬆大氣。

Alt+Ctrl+F組合鍵可以彈出文件傳輸界面,開發和升級的時候,在Linux和Windows之間進行文件傳輸。如圖所示。

(2)Code::Blocks

在Windows下將源代碼從linux下拉來後,需要在本地進行開發。可以直接使用文本編輯器開發,但是缺少關鍵字高亮,函數跳轉等功能,開發起來比較困難。故需要使用到IDE工具。下面介紹3款工具。

第一款,Code::Blocks,這一款比較推薦,在Windows和Linux下都有版本。新建工程,File->New->Project,將代碼加入工程後即可進行開發,可以關鍵字高亮,函數跳轉,函數引用列表等功能。主要缺點是開發好的代碼需要上傳到Linux開發機器上進行編譯調試。

第二款,Source Insight

Source Insight使用較廣,使用方式和Code::Blocks基本一致,只是快捷鍵不一致。缺點同樣是需要把文件上傳後編譯開發。

第三款,Eclipse+RSE插件

Eclipse安裝Remote System Explorer插件後,可以直接連上linux的機器,對機器上的代碼進行直接編輯開發,此種開發的模式優點是不需要對代碼文件上傳,缺點是對函數跳轉,查找等功能很欠缺,基本上相當於文件編輯模式。

上面三種IDE都可以進行Linux下C++的開發,但是編譯鏈接調試依然是在Linux環境下進行。所以可以根據各自的優缺點進行選擇。

1.3 Linux下技術

Linux下開發的基本技能要求如下:

熟悉Linux下基本命令:

cp /rm/ find/cd/ll/mkdir 等等

熟悉Makefile文件編寫

開源庫搜索與安裝yum

調試工具gdb的使用

Linux API

下面將詳細講解這些技術的使用。

二,Demo開發及發佈

至此,Linux下環境的開發工具齊全了,下面開始從頭開始搭建工程。

(1)創建工程

登錄開發機器115.114,新建目錄Demo,進入該目錄:

cd /home/

mkdir Demo

cd Demo

(2)新建文件

新建3個文件

分別輸入如下內容

1. print.h

#include<stdio.h>

void printHello();

2. print.c

#include"print.h"

void printHello(){

  printf("Hello, world\n");

 }

3. main.c

#include "print.h"

int main(void){

 printHello();

 return 0;

}

(3)創建MakeFile文件

helloworld:main.o print.o

    g++ -o helloworld main.o print.o

main.o:main.cprint.h

    g++ -c main.c

print.o:print.cprint.h

    g++ -c print.c

clean: rmhelloworld main.o print.o

 

其中makefile的撰寫是基於規則的,當然這個規則也是很簡單的,就是:

target (生成的對象): prerequisites(生成對象的依賴條件)

  command  //任意的shell 命令                                        

如helloworld:main.o print.o

g++ -o helloworld main.o print.o

需要生成可執行文件helloworld,則需要依賴main.o print.o 文件,即使用g++ -o helloword main.o print.o生成helloword,

其中-o 生成的可執行文件名稱,main.o print.o是已經生成好的兩個文件對象。

接下來,

main.o:main.cprint.h

g++ -c main.c

即main.o的生成由main.c和 print.h編譯得來,即執行g++ -c main.c命令生成。以此類推。當然如果在項目源文件和頭文件都比較多的情況下,採用該種編寫方式會比較繁瑣且容易出錯,故可以使用Makefile中的一些函數進行自動編譯。可參考Makefile的相關教程。

其中clean的命令是刪除文件helloworld main.o print.o,寫好此文件後,make clean 可以實現將生成的文件刪除從而可以再次進行編譯。

(4)編譯執行

發好了源文件以及MakeFile文件後,接下來可以進行編譯運行。在當前目錄先執行make命令;

可以看到Makefile中的命令都已經執行,查看當前目錄ls;

可以看到生成了可執行文件helloworld和中間過程文件main.o,print.o。

輸入命令./helloworld後可以看到界面打印出了hello world字樣。

 

三,調試測試開發

程序開發必定需要進行調試開發。在Linux下開發調試主要依靠GDB工具。

首先,編譯的時候需要在編譯命令中加入-g選項,這樣保證調試的時候可以打印出源代碼。

添加-g,修改Makefile文件之後,重新編譯make ,可以看到編譯命令中多出了-g。

進入調試模式,gdb helloworld

gdb的命令很多,gdb把之分成許多個種類。help命令只是例出gdb的命令種類,如果要看種類中的命令,可以使用help <class> 命令,如:help breakpoints,查看設置斷點的所有命令。也可以直接help <command>來查看命令的幫助。

l+函數名稱可以查看函數源碼

設置斷點,輸入命令

b 3

則再文件main的第三行設置了斷點。

如果需要設置其他文件中的函數斷點,可以如圖設置,即文件名加函數名稱,或者函數行數即可

Info break 命令即可查看當前設置的所有斷點。

輸入命令r,調試運行程序開始。程序卡在第一個斷點的位置上。此時輸入命令 s,即可進入該函數裏面進行調試,輸入命令l即可查看當前函數的源代碼;

輸入命令n可以進行單步執行;

輸入 p+變量名 可以打印當前變量的值;

輸入命令q退出調試;

 

Gdb 命令豐富多彩,目前介紹的只是最基本的命令,但是針對一般的調試已經足夠,需要用戶自己不斷的學習發掘才能最大限度的使用gdb的好處。  

四,高階Demo開發

接下來介紹一個進階版開發教程。主要從頭開始搭建一個包含一些功能模塊的項目。本Demo主要包括日誌打印,配置文件讀取,UDP端口監聽,開啓線程等功能。

(1)新建工程目錄

mkdir HighDemo

然後創建cpp,.h文件

其中base64主要用來進行base64編碼解碼,comm_codec主要用來通用的解析XML,格式轉換等函數集合,config主要用來加載配置文件config.xml,LogClinet主要用來打印日誌文件,strtok_r主要用來字符串切割,其中NetFrame是包含main方法的主線程文件。創建完了CPP和頭文件之後,將創建Makefile文件。

(2)Makefile文件編寫

進階版的Makefile,先從兩個函數可以講起。函數Wildcard和函數patsubst。

“$(wildcard *.cpp)”來獲取工作目錄下的所有的.cpp文件列表

以使用“$(patsubst %.cpp,%.o,$(wildcard *.cpp))”,首先使用“wildcard”函數獲取工作目錄下的.cpp文件列表;之後將列表中所有文件名的後綴.c替換爲.o。這樣我們就可以得到在當前目錄可生成的.o文件列表。

三個變量分別是$@,$^,$<代表的意義分別是:

$@--目標文件,

$^--所有的依賴文件,

$<--第一個依賴文件。

所以本項目的Makefile文件寫成如下

TARGET=NetFrame

CC=g++

INCLUDES+=-I./include   -I/usr/local/src/oracle/10g/rdbms/public-I/usr/include/libxml2 -I/usr/local/ssl/include -I/usr/local/include

LIB=-lstdc++-lpthread -lrt -L/usr/local/src/oracle/10g/lib -lclntsh   -L/usr/lib64 -lxml2-L/usr/local/ssl/lib -lcrypto

OBJS:=$(patsubst %.cpp,%.o,$(wildcard *.cpp))

 

$(TARGET):${OBJS}

   $(CC) $^ $(LIB)  -o $@

 

.cpp.o:

   $(CC) $(FLAGS) $(INCLUDES)  -o $@ -c $<

 

clean:

   rm-rf $(TARGET)

   rm-f $(OBJS)

輸入命令

make

則生成可執行文件NetFrame

INCLUDES和LIB主要是使用到的庫頭文件和動態庫或者靜態庫文件的路徑,包含進來即可。如果使用了新的開源庫,則需要安裝以及查找對應的庫路徑添加進來。

如需要使用libcurl庫,則yum search curl

找到curl-devel.x86_64,再yum install curl-devel.x86_64 安裝即可

之後如果你不確定動態庫被安裝到哪裏去了,可以輸入如下命令:

find / -name libcurl*,如圖

(3)Main文件編寫

編寫NetFrame.cpp文件。

首先導入相關頭文件,其中<>表示引用的是編譯器的類庫路徑裏面的頭文件" "引用的是你程序目錄的相對路徑中的頭文件,設置一下常量(最好放在頭文件裏)。

之後定義Main函數,調用各個模塊的函數接口實現對應的功能,如調用日誌函數打印日誌,調用配置文件解析配置,獲取配置文件中的參數功能。

另外開啓一條線程,進行UDP的監聽操作,開啓的端口和IP從配置文件中讀取。

該線程實現的功能也很簡單,用戶發送指定格式的UDP包,系統收到報文後,解析報文內容進行返回數據或者重新加載配置文件等等。

輸入命令./NerFrame命令啓動進程。

另開一個窗口,輸入測試數據

echo "task=reload&msg=pleasereload"|nc -u 127.0.0.1 9999

可以看到返回了msg裏面的內容

服務端重新加載了配置文件。

 

至此,高階版Linux下C/C++開發指南介紹完畢,從頭開始實踐可以把一個熟悉C/C++語法的程序員帶入Linux的世界中。

另外,由於是在Linux下開發,所以需要熟悉Linux的系統函數,這些系統函數是在程序中大量使用到,如open,close,recvfrom等等,推薦一本書《UNIX操作系統設計》,可以學習很多操作系統的API,對於程序開發有很大的幫助。另外如果對Linux內核有興趣的可以學習《深入理解Linux內核》


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章