使用Visual Studio 2017開發(fā)Linux程序

使用Visual Studio 2017開發(fā)Linux程序

環(huán)境:

win7_x64旗艦版锅尘、VS2017企業(yè)版严卖、VMware10.0.2案训、CentOS7
  在CentOS7上首先需要安裝gcc企锌、g++和gdbserver角寸,這里就不多說

一乖酬、安裝VS2017

1.1 安裝VS2017時死相,必須要勾選“使用C++的Linux開發(fā)”工具集


使用C++的Linux開發(fā)

二、創(chuàng)建Linux解決方案

2.1 創(chuàng)建一個名稱為"TestLinux"的解決方案咬像,我們稍后會在這個解決方案內(nèi)新建多個Linux項目(包括可執(zhí)行程序算撮、動態(tài)庫生宛、靜態(tài)庫等)


創(chuàng)建Linux解決方案

2.2 添加新建項目可執(zhí)行程序項目"test"


創(chuàng)建linux項目

控制臺應用程序

2.3 添加新建項目,創(chuàng)建動態(tài)庫
創(chuàng)建動態(tài)庫

創(chuàng)建動態(tài)庫

2.4 添加新建項目肮柜,創(chuàng)建靜態(tài)庫


創(chuàng)建靜態(tài)庫

創(chuàng)建靜態(tài)庫

三陷舅、添加測試代碼

3.1 "test"項目中main.cpp代碼:

int main()
{
    printf("hello from test!\n");
    printf("static_library test : %d\n", static_test(1));
    printf("dynamic_library test : %d\n", dynamic_test(1)); return 0;
}

3.2 在"static_library"項目中添加static.h和static.cpp

static.h

#ifndef _STATIC_LIBRARY_H_ 
#define _STATIC_LIBRARY_H_
int static_test(int n); 
#endif // !_STATIC_LIBRARY_H_

static.cpp

#include "static.h"
int static_test(int n)
{ return n * 3;
}

3.3 在"dynamic_library"項目中添加dynamic.h和dynamic.cpp
dynamic.h

#ifndef _DYNAMIC_LIBRARY_H_
 #define _DYNAMIC_LIBRARY_H_
int dynamic_test(int n);
 #endif // !_DYNAMIC_LIBRARY_H_

dynamic.cpp

#include "dynamic.h"
int dynamic_test(int n)
{ return n * 2;
}

四、項目配置

4.1 "常規(guī)"配置

配置主程序:

配置屬性-常規(guī)

本地輸出目錄:"(ProjectDir)bin\(Platform)$(Configuration)"修改為"(ProjectDir)..\bin\(Platform)$(Configuration)"素挽,是為了將所有項目輸出文件放到同一個目錄中蔑赘,方便相互引用。

目標文件擴展名:".out"修改為""预明,是為了不生成文件后綴缩赛,一般的Linux可執(zhí)行程序是沒有擴展名稱的,可修改也可不修改撰糠。

遠程生成根目錄:"~/projects"修改為"/root/projects/(SolutionName)"酥馍,"~"和"/root"是等價的,但是運行時動態(tài)庫搜索目錄不支持~路徑阅酪,添加“(SolutionName)”是為了區(qū)分不同的解決方案下相同名稱的項目旨袒。

遠程生成項目目錄:"~/projects"修改為"/root/projects/(SolutionName)","~"和"/root"是等價的术辐,但是運行時動態(tài)庫搜索目錄不支持~路徑砚尽,添加“(SolutionName)”是為了區(qū)分不同的解決方案下相同名稱的項目。

配置動態(tài)庫:"(RemoteRootDir)/(ProjectName)"修改為"$(RemoteRootDir)"

配置屬性-常規(guī)

本地輸出目錄:"(ProjectDir)bin\(Platform)$(Configuration)"修改為"(ProjectDir)..\bin\(Platform)$(Configuration)"

目標文件擴展名:".out"修改為".so"

遠程生成根目錄:"~/projects"修改為"/root/projects/$(SolutionName)"

配置類型:"應用程序(.out)"修改為"動態(tài)庫(.so)"

配置靜態(tài)庫:

配置屬性-常規(guī)

本地輸出目錄:"(ProjectDir)bin\(Platform)$(Configuration)"修改為"(ProjectDir)..\bin\(Platform)$(Configuration)"

目標文件擴展名:".out"修改為".a"

遠程生成根目錄:"~/projects"修改為"/root/projects/$(SolutionName)"

配置類型:"應用程序(.out)"修改為"動態(tài)庫(.a)"

4.2 "調(diào)試"配置

配置屬性-調(diào)試

程序:"(RemoteTargetPath)"修改為"(RemoteRootDir)/bin/(Platform)/(Configuration)/(TargetName)(TargetExt)"辉词,因為前面修改了本地輸出目錄導致遠程輸出目錄也相應發(fā)生變化必孤,這里修改一致。

工作目錄:"(RemoteOutDir)"修改為"(RemoteRootDir)/bin/(Platform)/(Configuration)"瑞躺,這個是遠程主機CentOS上的路徑敷搪,如果設置不正確將找不到引用的動態(tài)庫,調(diào)試程序無法啟動幢哨。

其他調(diào)試程序命令:""修改為"set solib-search-path (SolutionDir)bin/(Platform)/$(Configuration)"赡勘,這個是本地路徑,調(diào)試符號是從本地加載的捞镰,否則調(diào)試動態(tài)庫時闸与,gdb會輸出沒有找到調(diào)試符號文件。

4.3 "C/C++"配置

"C/C++"配置

附加包含目錄:在"$(StlIncludeDirectories);%(AdditionalIncludeDirectories)"前面添加"./..;"岸售,這個是遠程主機CentOS上的路徑践樱,相當于gcc編譯時指定"-I[路徑]"選項;一般是先把需要的頭文件從CentOS復制到windows冰评,然后設置"配置屬性"->"VC+ +目錄"->"包含目錄"映胁,這樣在編寫Linux程序時,提示信息更加的友好^^甲雅。

4.4 "鏈接器"配置

"鏈接器"配置

附加庫目錄:在"%(AdditionalLibraryDirectories)"前面添加"(RemoteRootDir)/bin/(Platform)/$(Configuration);"解孙,這個是遠程主機CentOS上的路徑坑填,相當于gcc編譯時指定"-L[路徑]"選項,用于指定引用動態(tài)庫和靜態(tài)庫的目錄弛姜;

"鏈接器"配置

庫依賴項:添加"dynamic_library;static_library"脐瑰,相當于gcc設置"-l[庫名稱]"選項,用于指定鏈接時所需要的動態(tài)庫和靜態(tài)庫名稱廷臼,如果找不到依賴的庫文件苍在,鏈接時會錯誤,顯示"無法解析的符號"荠商。

"鏈接器"配置

其他選項:添加"-Wl,-rpath=(RemoteRootDir)/bin/(Platform)/$(Configuration) "寂恬,指定程序運行時搜索動態(tài)庫的路徑。

五莱没、開始調(diào)試

5.1 設置遠程調(diào)試主機

遠程調(diào)試主機

5.2 顯示Linux控制臺

Linux控制臺
Linux控制臺

最后的Demo下載地址:TestLinux.zip

其他錯誤:

1)Inferior 1 (process 6074) exited normally

image

通常是沒有生成Debug可執(zhí)行文件初肉,若使用cmake,則添加CMAKE_BUILD_TYPE=Debug饰躲,重新生成即可牙咏。
為代碼補全添加對 Linux 庫函數(shù)的支持
雖說上述代碼可以直接運行,然而宇宙第一 IDE 竟然不提供代碼補全嘹裂,反而告訴你頭文件找不到/函數(shù)未定義妄壶,并且打了一大堆的波浪線~~~~~~~~~~~~~~~~!想逼死強迫癥么寄狼?

6丁寄、將 Linux Headers 拷貝到 VS Linux 頭文件目錄中為 VS 添加對 Linux 庫函數(shù)的支持!

通過如下步驟打開下圖窗口:

解決方案 - 項目名 - (右鍵) - 屬性 - 配置屬性 - VC++目錄 - 常規(guī) - 包含目錄 - (單擊) - (下箭頭) - 編輯

image.png

找到 Linux 頭文件所在目錄例嘱。我的目錄是這樣的:

D:\Software\Studio\Visual Studio Community 2017\Common7\IDE\VC\Linux\include\usr\include\

要知道 WSL 是可以直接訪問 Windows 目錄的狡逢。WSL 根目錄下的mnt/下保存著各邏輯分區(qū)的卷標宁舰,你會看到c拼卵、d、e etc. 這樣的目錄名蛮艰。我們可以直接把 WSL 中的 Linux 頭文件拷貝到 VS 的 linux 頭文件目錄中腋腮,比如:

cp usr/include/ /mnt/d/Software/Studio/Visual\ Studio\ Community\ 2017/Common7/IDE/VC/Linux/include/usr/include/ -R
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市壤蚜,隨后出現(xiàn)的幾起案子即寡,更是在濱河造成了極大的恐慌,老刑警劉巖袜刷,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聪富,死亡現(xiàn)場離奇詭異,居然都是意外死亡著蟹,警方通過查閱死者的電腦和手機墩蔓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門梢莽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奸披,你說我怎么就攤上這事昏名。” “怎么了阵面?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵轻局,是天一觀的道長。 經(jīng)常有香客問我样刷,道長仑扑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任置鼻,我火速辦了婚禮夫壁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沃疮。我一直安慰自己盒让,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布司蔬。 她就那樣靜靜地躺著邑茄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俊啼。 梳的紋絲不亂的頭發(fā)上肺缕,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音授帕,去河邊找鬼同木。 笑死,一個胖子當著我的面吹牛跛十,可吹牛的內(nèi)容都是我干的彤路。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芥映,長吁一口氣:“原來是場噩夢啊……” “哼洲尊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奈偏,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坞嘀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惊来,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丽涩,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年裁蚁,在試婚紗的時候發(fā)現(xiàn)自己被綠了矢渊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片检眯。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖昆淡,靈堂內(nèi)的尸體忽然破棺而出锰瘸,到底是詐尸還是另有隱情,我是刑警寧澤昂灵,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布避凝,位于F島的核電站,受9級特大地震影響眨补,放射性物質(zhì)發(fā)生泄漏管削。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一撑螺、第九天 我趴在偏房一處隱蔽的房頂上張望含思。 院中可真熱鬧,春花似錦甘晤、人聲如沸含潘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遏弱。三九已至,卻和暖如春塞弊,著一層夾襖步出監(jiān)牢的瞬間漱逸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工游沿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饰抒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓诀黍,卻偏偏與公主長得像袋坑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蔗草,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理咒彤,服務發(fā)現(xiàn)疆柔,斷路器咒精,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,138評論 25 707
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料旷档? 從這篇文章中你...
    hw1212閱讀 12,724評論 2 59
  • 如果你是一個學生或曾經(jīng)是個學生故觅,一定聽說過“錯題本”這種東西吧?一定有至少一個老師對我們講過:“要有錯題本啊...
    嘎嘣豆豆兒閱讀 1,095評論 0 1