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 |
|
安裝完了之后,你不要做什么配置,也不需要,直接測試一下
1 2 3 4 5 |
|
restart service and sync the time
1 2 |
|
如果顯示上面的內容說明同步成功了,然后在crontab里面加上以下內容。
1 |
|
每隔十分鍾同步一次。推薦幾個時間服務器。
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 |
|
2、配置ntp
1 2 3 4 5 6 7 8 9 10 11 12 |
|
3、啟動 ntp
1 |
|
4、查看並測試
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
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