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內核》

Linux環境下的C++開發

因為想要把程序從Windows平台移植到Linux平台,故寫了此系列文章,以方便以后自己和大家,少走彎路

整個環境采用CentOS7+QtCreator+cmake+gcc的形式

1、從https://www.centos.org/download/上下載CentOS鏡像,我選的是DVD ISO版本。然后選擇一款虛擬機,我使用Virtual Box,這里記住最好選擇最新的虛擬機版本,我就是使用老版的虛擬機,導致虛擬機增強插件安裝失敗。

選擇新建虛擬機,類型和版本如下,CentOS是Red Hat的衍生版本。

后面的選項按自己的習慣設置。設置好后,把CentOS的鏡像設置到虛擬機的DVD光驅里,啟動虛擬機

啟動到下面界面后,直接選擇第一個選項“Install CentOS 7”,這樣快些,因為不用檢測鏡像完整性。

選擇安裝界面語言,默認選擇英文。我這里考慮到兼容性,所以安裝界面和操作系統語言我都是選擇的英文

安裝選項

Date & Time,選擇中國上海。

Language support,我們會使用中文,所以最好添加中文支持

softwave selection,因為我初次使用Linux,所以選擇了帶桌面,但不管是選擇哪個Base Environment,右邊的Development Tools最好選中,會省去你安裝gcc和內核源碼等軟件的時間。

installation destionation,選擇你想安裝的位置,我這就一個虛擬盤

然后就可以點擊安裝了,點擊安裝后,會出現安裝界面,順便讓你設置root賬戶密碼和是否添加新用戶,這里按自己習慣設置

等待一段時間后系統就安裝好了

1、安裝cmake(以cmake-3.12.0.tar.gz源碼安裝為例)

先去官網https://cmake.org/download/上下載cmake源碼。下載后解壓編譯,gmake install需要root權限

tar zxvf cmake-3.12.0.tar.gz

cd cmake-3.12.0

./bootstrap

gmake

gmake install

2、安裝qtCtreator

http://download.qt.io/official_releases/qtcreator/下載需要的qtCreator版本,然后運行安裝文件即可

3、創建C++項目

運行qtCreator,菜單的“File”->“New File Or Project”

右邊Projects選擇Non-Qt Project,中間選擇Plain C++ Application,然后點擊右下角的Choose

然后選擇項目的存放位置

編譯方式,這里我們選擇CMake

然后選擇部署平台,如果之前安裝好了gcc、gdb、cmake,這里會自動出現一個默認的kit,如果沒有自動識別出來或提示識別失敗,可以在菜單的“Tools”->“Options”->“Kits”中設置。

版本管理,按自己的習慣選擇,點擊“Filish”就創建了C++項目


 

qtCreator對cmake支持還不是那么好,在項目中無法通過右鍵添加源文件,只有在CMakeList.txt中顯示添加的文件才會在項目列表中顯示出來。在CMakeList.txt中添加如下代碼,就能把項目下的所有.h和.cpp的文件都在左邊項目列表中顯示出來

file(GLOB files_list ./*.cpp ./*.h)
add_custom_target(files_list SOURCES ${files_list})

如果需要對g++添加自定義參數,配置如下

#g++編譯參數
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pthread -m64 -std=c++11")

 

添加第三方庫頭文件目錄和庫目錄配置如下

#第三方庫庫文件目錄
link_directories("/home/user/boost_1_67_0/lib")
#第三方庫頭文件目錄
include_directories("/home/user/libev-4.24" "/home/user/boost_1_67_0")

 

配置生成執行程序

#輸出項目名稱
project(app)
#編譯項目所需源碼
set(SRC_APP "aaa.cpp" "bbb.h")
add_executable(${PROJECT_NAME} "main.cpp" ${SRC_APP})

 

配置生成動態庫

#輸出項目名稱
project(module_abc)
#編譯項目所需源碼,.表示CMakeList.txt所在文件夾下所有源文件
AUX_SOURCE_DIRECTORY(. SRC_ABC)
#編譯成動態庫
add_library(${PROJECT_NAME} SHARED ${SRC_ABC})
#動態庫按C語言接口導出
set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C)

 

添加第三方依賴庫配置如下(以libev庫為例,${PROJECT_NAME}是之前定義的輸出程序名稱)

target_link_libraries (${PROJECT_NAME}  ev)

 

添加子項目,module_abc指當前文件夾下的module_abc文件夾

add_subdirectory(module_abc)

 

VS編譯utf8源碼時的問題

在VS里編譯utf8格式的源代碼時,有時會出現以下錯誤:

E:\Projects\back_mdfactory\src\service_context.cpp(33): error C2001: 常量中有換行符
E:\Projects\back_mdfactory\src\service_context.cpp(33): fatal error C1057: 宏擴展中遇到意外的文件結束

原因是VS默認使用帶BOM的UTF8格式源碼編譯,遇到不帶BOM的UTF8源碼時,會當成ANSI格式源碼,導致出現一些莫名奇妙的錯誤。方法有幾種:

1、將源碼從不帶BOM的UTF8改為帶BOM的UTF8源碼,這個會對跨平台開發有影響,因為Linux默認是不帶BOM源碼。

2、在源碼的中文字符串后面加一個空格或是其他字符,這個會強行改變源碼內容

3、修改VS工程屬性,C/C++ -> 命令行 的其他選項里,增加/utf8,這個最合適,但貌似要求VS2015 Update 1以上版本。

C++中的.和::和:和->的區別

  在學習C++的過程中我們經常會用到.和::和:和->,在此整理一下這些常用符號的區別。 

    1、A.B則A為對象或者結構體;

    2、A->B則A為指針,->是成員提取,A->B是提取A中的成員B,A只能是指向類、結構、聯合的指針;

    3、::是作用域運算符,A::B表示作用域A中的名稱B,A可以是名字空間、類、結構;

    4、:一般用來表示繼承;

Linux下批量轉換windows格式“\r\n“轉為“\n“

Linux下,查找當前目錄所有文件並將其中\r格式取掉。方法僅供參考,謹慎使用或使用前備份。

find . -type f -print0 | xargs -0 sed -i "s/\r//g" #xargs命令中-0用於去除空格內容,通過null分隔參數 

本文源站鏈接:LinuxShell基礎命令

linux批量去bom命令

grep -r -I -l $’^\xef\xbb\xbf’ ./*|xargs -i sed -i ‘1 s/^\xef\xbb\xbf//’ {}
在linux上面運行,將上面的./*換成你的目錄即可。

 

linux實現時間同步有哪幾種方法

Linux實現時間同步的方法的有兩種,分別是:1、使用ntpdate從時間服務器來更新時間,不需要自己做任何配置;2、使用ntp來搭建自己的時間服務器。

【推薦課程:Linux系統

由於硬件的原因,機器或多或少的跟標准時間對不上,誤差幾秒到幾分鍾不等。對於服務器來說時間不准會有很多麻煩。例如支付的時候,無法下單,游戲無法登錄等。接下來將在文章中為大家分享Linux系統中如何實現時間同步,希望對大家有所幫助

方法一:用ntpdate從時間服務器更新時間

如果linux系統沒有ntpdate這個命令,可以輸入以下代碼進行安裝

1

yum install ntp

安裝完了之后,你不要做什么配置,也不需要,直接測試一下

1

2

3

4

5

vi /etc/ntp.conf

add below:

server 1.cn.pool.ntp.org

server 3.asia.pool.ntp.org

server 2.asia.pool.ntp.org

restart service and sync the time

1

2

[root@localhost ~]# ntpdate time.nist.gov 

22 Oct 21:11:43 ntpdate[5014]: adjust time server 207.200.81.113 offset -0.018788 sec

如果顯示上面的內容說明同步成功了,然后在crontab里面加上以下內容。

1

*/10 * * * * ntpdate time.nist.gov   #域名或IP

每隔十分鍾同步一次。推薦幾個時間服務器。

time.nist.gov

time.nuri.net

0.asia.pool.ntp.org

1.asia.pool.ntp.org

2.asia.pool.ntp.org

3.asia.pool.ntp.org

方法二、用ntp搭建自己的時間服務器

上面是利用別人的時間服務器來同步時間,這些時間服務器都是比較權威的。當我們自己搭建時間服務器就不用crontab來定時去跑。

1、安裝時間服務器ntp

1

yum install ntp

2、配置ntp

1

2

3

4

5

6

7

8

9

10

11

12

[root@localhost ~]# cat /etc/ntp.conf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}' 

restrict default ignore   //默認不允許修改或者查詢ntp,並且不接收特殊封包 

restrict 127.0.0.1        //給於本機所有權限 

restrict 192.168.1.0 mask 255.255.255.0 notrap nomodify  //給於局域網機的機器有同步時間的權限 

server time.nist.gov prefer      //設置時間服務器,加prefer表示優先 

server 0.asia.pool.ntp.org 

server 1.asia.pool.ntp.org 

server 2.asia.pool.ntp.org 

server  127.127.1.0     # local clock 

fudge   127.127.1.0 stratum 10 

driftfile /var/lib/ntp/drift 

keys /etc/ntp/keys

3、啟動 ntp

1

[root@localhost ~]# /etc/init.d/ntpd start

4、查看並測試

1

2

3

4

5

6

7

8

9

10

11

12

13

[root@localhost ~]# netstat -upnl |grep ntpd   //查看時程   

[root@localhost ~]# ntpq -pn    //查看同步的服務器IP  

remote           refid      st t when poll reach   delay   offset  jitter 

==============================================================================  

50.77.217.185   .INIT.          16 u    -   64    0    0.000    0.000   0.000  

202.90.158.4    .INIT.          16 u    -   64    0    0.000    0.000   0.000  

202.71.100.89   .INIT.          16 u    -   64    0    0.000    0.000   0.000  

202.134.1.10    .INIT.          16 u    -   64    0    0.000    0.000   0.000 

*127.127.1.0     .LOCL.          10 l   18   64  377    0.000    0.000   0.001   

[root@localhost ~]# ntpstat   //同步的結果 

synchronised to local net at stratum 11  

time correct to within 12 ms  

polling server every 512 s

remote:即NTP主機的IP或主機名稱。注意最左邊的符號,如果由“+”則代表目前正在作用鍾的上層NTP,如果是“*”則表示也有連上線,不過是作為次要聯機的NTP主機。

  • refid:參考的上一層NTP主機的地址

  • st:即stratum階層

  • when:幾秒前曾做過時間同步更新的操作

  • poll:下次更新在幾秒之后

  • reach:已經向上層NTP服務器要求更新的次數

  • delay:網絡傳輸過程鍾延遲的時間

  • offset:時間補償的結果

  • jitter:Linux系統時間與BIOS硬件時間的差異時間

推薦第一種方法,雖然搭建個時間服務器,比較簡單的,但是我覺得沒有這個必要。如果用別人的時間服務器,每隔10分鍾同步一次,可以精確到毫秒。

https://m.php.cn/article/417290.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM