使用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ā)”工具集
二、創(chuàng)建Linux解決方案
2.1 創(chuàng)建一個名稱為"TestLinux"的解決方案咬像,我們稍后會在這個解決方案內(nèi)新建多個Linux項目(包括可執(zhí)行程序算撮、動態(tài)庫生宛、靜態(tài)庫等)
2.2 添加新建項目可執(zhí)行程序項目"test"
2.3 添加新建項目,創(chuàng)建動態(tài)庫
2.4 添加新建項目肮柜,創(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ī)"配置
配置主程序:
本地輸出目錄:"(Platform)$(Configuration)"修改為"
(Platform)$(Configuration)"素挽,是為了將所有項目輸出文件放到同一個目錄中蔑赘,方便相互引用。
目標文件擴展名:".out"修改為""预明,是為了不生成文件后綴缩赛,一般的Linux可執(zhí)行程序是沒有擴展名稱的,可修改也可不修改撰糠。
遠程生成根目錄:"~/projects"修改為"/root/projects/(SolutionName)”是為了區(qū)分不同的解決方案下相同名稱的項目旨袒。
遠程生成項目目錄:"~/projects"修改為"/root/projects/(SolutionName)”是為了區(qū)分不同的解決方案下相同名稱的項目。
配置動態(tài)庫:"(ProjectName)"修改為"$(RemoteRootDir)"
本地輸出目錄:"(Platform)$(Configuration)"修改為"
(Platform)$(Configuration)"
目標文件擴展名:".out"修改為".so"
遠程生成根目錄:"~/projects"修改為"/root/projects/$(SolutionName)"
配置類型:"應用程序(.out)"修改為"動態(tài)庫(.so)"
配置靜態(tài)庫:
本地輸出目錄:"(Platform)$(Configuration)"修改為"
(Platform)$(Configuration)"
目標文件擴展名:".out"修改為".a"
遠程生成根目錄:"~/projects"修改為"/root/projects/$(SolutionName)"
配置類型:"應用程序(.out)"修改為"動態(tài)庫(.a)"
4.2 "調(diào)試"配置
程序:"(RemoteRootDir)/bin/
(Configuration)/
(TargetExt)"辉词,因為前面修改了本地輸出目錄導致遠程輸出目錄也相應發(fā)生變化必孤,這里修改一致。
工作目錄:"(RemoteRootDir)/bin/
(Configuration)"瑞躺,這個是遠程主機CentOS上的路徑敷搪,如果設置不正確將找不到引用的動態(tài)庫,調(diào)試程序無法啟動幢哨。
其他調(diào)試程序命令:""修改為"set solib-search-path (Platform)/$(Configuration)"赡勘,這個是本地路徑,調(diào)試符號是從本地加載的捞镰,否則調(diào)試動態(tài)庫時闸与,gdb會輸出沒有找到調(diào)試符號文件。
4.3 "C/C++"配置
附加包含目錄:在"$(StlIncludeDirectories);%(AdditionalIncludeDirectories)"前面添加"./..;"岸售,這個是遠程主機CentOS上的路徑践樱,相當于gcc編譯時指定"-I[路徑]"選項;一般是先把需要的頭文件從CentOS復制到windows冰评,然后設置"配置屬性"->"VC+ +目錄"->"包含目錄"映胁,這樣在編寫Linux程序時,提示信息更加的友好^^甲雅。
4.4 "鏈接器"配置
附加庫目錄:在"%(AdditionalLibraryDirectories)"前面添加"(Platform)/$(Configuration);"解孙,這個是遠程主機CentOS上的路徑坑填,相當于gcc編譯時指定"-L[路徑]"選項,用于指定引用動態(tài)庫和靜態(tài)庫的目錄弛姜;
庫依賴項:添加"dynamic_library;static_library"脐瑰,相當于gcc設置"-l[庫名稱]"選項,用于指定鏈接時所需要的動態(tài)庫和靜態(tài)庫名稱廷臼,如果找不到依賴的庫文件苍在,鏈接時會錯誤,顯示"無法解析的符號"荠商。
其他選項:添加"-Wl,-rpath=(Platform)/$(Configuration) "寂恬,指定程序運行時搜索動態(tài)庫的路徑。
五莱没、開始調(diào)試
5.1 設置遠程調(diào)試主機
5.2 顯示Linux控制臺
最后的Demo下載地址:TestLinux.zip
其他錯誤:
1)Inferior 1 (process 6074) exited normally
通常是沒有生成Debug可執(zhí)行文件初肉,若使用cmake,則添加CMAKE_BUILD_TYPE=Debug饰躲,重新生成即可牙咏。
為代碼補全添加對 Linux 庫函數(shù)的支持
雖說上述代碼可以直接運行,然而宇宙第一 IDE 竟然不提供代碼補全嘹裂,反而告訴你頭文件找不到/函數(shù)未定義妄壶,并且打了一大堆的波浪線~~~~~~~~~~~~~~~~!想逼死強迫癥么寄狼?
6丁寄、將 Linux Headers 拷貝到 VS Linux 頭文件目錄中為 VS 添加對 Linux 庫函數(shù)的支持!
通過如下步驟打開下圖窗口:
解決方案 - 項目名 - (右鍵) - 屬性 - 配置屬性 - VC++目錄 - 常規(guī) - 包含目錄 - (單擊) - (下箭頭) - 編輯
找到 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