2.6.1 前言
? ? ? ?在linux環(huán)境下開發(fā)C++程序佩番,除了需要掌握C++的知識(shí)外,還需要掌握如何寫makefile和使用GDB進(jìn)行調(diào)試罢杉,這對(duì)于不熟悉makefile和GDB的開發(fā)人員是比較麻煩的趟畏,目前vs2015及以上的版本能夠支持linux c++程序的開發(fā)和調(diào)試,與傳統(tǒng)vs上的windows編程不同的是滩租,vs所需要的Linux環(huán)境需要搭載在一個(gè)linux的服務(wù)器上赋秀,vs相當(dāng)于將windows系統(tǒng)和這個(gè)linux系統(tǒng)之間建立了某種映射,可以將代碼復(fù)制到linux中對(duì)應(yīng)的目錄中律想,并且windows系統(tǒng)中的vs能夠看到運(yùn)行的情況猎莲,甚至是對(duì)代碼進(jìn)行斷點(diǎn)調(diào)試,方便了在windows環(huán)境下的開發(fā)人員技即。
2.6.2 開發(fā)環(huán)境
在開發(fā)之前我們需要特定的環(huán)境和安裝一些必須的軟件:
1.環(huán)境:win7及以上版本的操作系統(tǒng)著洼,CentOS或ubuntu等任何一種linux操作系統(tǒng);
2.安裝軟件:windows操作系統(tǒng)上安裝VS2015及以上版本而叼;linux系統(tǒng)上安裝gcc身笤、g++和gdbserver,ssh-server軟件;
環(huán)境的準(zhǔn)備和依賴軟件的安裝請(qǐng)網(wǎng)上搜索自行安裝葵陵,這里就不詳細(xì)介紹液荸。
注意:
(1).安裝vs的時(shí)候我們除了安裝一些基本的開發(fā)組件外,還需要安裝c++的linux開發(fā)組件脱篙,如下圖:
(2).在linux系統(tǒng)上安裝好ssh軟件后娇钱,需要啟動(dòng)ssh-server服務(wù)伤柄,保證編譯程序時(shí),能將windows系統(tǒng)下的代碼成功復(fù)制到linux中對(duì)應(yīng)的目錄中文搂。
ssh-server服務(wù)的啟動(dòng)命令:
CentOS系統(tǒng) : systemctl start sshd
redhat系統(tǒng) : service sshd start
ubuntu系統(tǒng) : service ssh start
2.6.3 創(chuàng)建簡(jiǎn)單的linux工程
我們以vs2017創(chuàng)建工程在ubuntu系統(tǒng)中運(yùn)行為例:
1.創(chuàng)建一個(gè)linux平臺(tái)的空項(xiàng)目适刀,vs界面中選擇:文件->新建->項(xiàng)目,然后彈出下面的對(duì)話框细疚,開始新建工程蔗彤;
2.配置遠(yuǎn)程環(huán)境,這是我們程序運(yùn)行的linux環(huán)境疯兼,需要在配置ssh遠(yuǎn)程登錄然遏;
vs界面中選擇:工具->選項(xiàng)->跨平臺(tái)->連接管理器,界面如下圖所示:
添加ssh遠(yuǎn)程登錄連接配置:點(diǎn)擊添加按鈕吧彪,界面如下:
配置成功后待侵,需要設(shè)置遠(yuǎn)程的存放代碼的目錄,即windows系統(tǒng)下的代碼復(fù)制到linux中對(duì)應(yīng)的目錄姨裸;
3.創(chuàng)建工程代碼文件秧倾,創(chuàng)建一個(gè)test.cpp文件,寫上經(jīng)典的打印“Hello,World!”傀缩;
調(diào)試運(yùn)行之前那先,我們需要調(diào)出Linux 控制臺(tái)窗口;
vs界面中選擇:調(diào)試->Linux 控制臺(tái)
啟動(dòng)調(diào)試后赡艰,界面如下;
程序在編譯售淡,運(yùn)行之前會(huì)把windows系統(tǒng)下的代碼復(fù)制到linux中對(duì)應(yīng)的目錄,如下圖所示:
2.6.4 創(chuàng)建有依賴庫(kù)的linux工程
以訪問boost庫(kù)的日期為例介紹如何調(diào)試并運(yùn)行程序:
1.修改test.cpp的代碼如下:
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian;
using namespace std;
int main()
{
????date d(2019, 4, 20);
????cout << "date: " << to_iso_extended_string(d) << endl;
????return 0;
}
2.添加依賴的頭文件目錄
3.添加依賴庫(kù)的文件目錄
4.添加依賴庫(kù)的庫(kù)文件名稱
5.完成了以上的步驟慷垮,編譯程序成功揖闸,但在運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò);如下圖所示:
因?yàn)槌绦蜃罱K還是在linux系統(tǒng)中運(yùn)行的料身,而使用vs2017做調(diào)試汤纸,只是與linux系統(tǒng)做了某種映射,使調(diào)試結(jié)果芹血,運(yùn)行結(jié)果在vs界面展示出來(lái)贮泞,所以我們需要在linux系統(tǒng)設(shè)置依賴庫(kù)的查找路徑。
linux下設(shè)置動(dòng)態(tài)庫(kù)的查找路徑一般有以下三種方式:
(1).使用export LD_LIBRARY_PATH=XXX祟牲,這種方式在退出當(dāng)前終端后就失效
export LD_LIBRARY_PATH=/root/opt/boost/lib:
(2).修改~ /.bashrc或~/.bash_profile或系統(tǒng)級(jí)別的/etc/profile中LD_LIBRARY_PATH的路徑隙畜;
在文件中添加export LD_LIBRARY_PATH=/root/opt/boost/libsource
命令可以用于重新執(zhí)行剛修改的初始化文件,使之立即生效说贝,而不必注銷并重新登錄
source .bashrc 或者 source /etc/profile
(3).在/etc/ld.so.conf文件中添加庫(kù)的搜索路徑议惰,這種方式不受用戶的限制
在/etc/ld.so.conf下面加一行/root/opt/boost/lib
然后執(zhí)行命令 /sbin/ldconfig 會(huì)更新搜索路徑到 /etc/ld.so.cache,此文件保存已排好序的動(dòng)態(tài)鏈接庫(kù)名字列表乡恕;
程序運(yùn)行時(shí)的搜索目錄會(huì)從默認(rèn)搜尋目錄(/lib和/usr/lib)以及動(dòng)態(tài)庫(kù)配置文件/etc/ld.so.conf內(nèi)所列的目錄下,搜索出可共享的動(dòng)態(tài)鏈接庫(kù)(格式如前介紹,lib*.so*),進(jìn)而創(chuàng)建出動(dòng)態(tài)裝入程序(ld.so)所需的連接和緩存文件言询。
6.在linux系統(tǒng)中修改程序的查找路徑
使用方式一設(shè)置查找路徑后俯萎,依然報(bào)錯(cuò),因?yàn)榉绞揭皇桥R時(shí)的設(shè)置方式运杭,只對(duì)當(dāng)前終端生效夫啊;
使用方式二,方式三設(shè)置后辆憔,程序能正常調(diào)試運(yùn)行撇眯;
如下圖所示:
2.6.5 總結(jié)
1.使用vs2017做調(diào)試,只是與linux系統(tǒng)做了某種映射虱咧,使調(diào)試結(jié)果熊榛,運(yùn)行結(jié)果在vs界面展示出來(lái)。?
2.程序編譯時(shí)腕巡,如果不能把代碼拷貝到linux中設(shè)置的遠(yuǎn)程目錄下玄坦,則可能是ssh服務(wù)沒有啟動(dòng)。?
3.程序調(diào)試運(yùn)行時(shí)绘沉,如果找不到需要鏈接的庫(kù)煎楣,則需要在linux系統(tǒng)中加入依賴庫(kù)的查找路徑。?