visual studio 2015下使用gcc調試linux c++開發環境搭建完整詳解


一直以來,相信絕大部分的開發都是windows/mac下做開發,尤其是非嵌入式和qt系的,而開源服務器程序絕大部分都是跑在Linux下,幾乎就沒有跑在windows下的。一直以來開發人員都是在windows下調試好非平台相關部分,然后到具體環境下去調試平台相關接口。

有着宇宙第一IDE之稱的VS自從薩提亞·納德拉上台之后,vs 2017正式支持跨平台開發,可是vs 2017聽說太巨無霸了,安裝好要幾十個GB。而且之前只裝了vs 2015,后來偶然搜到了翻譯了msdn官網的帖子,vs 2015有linux c++開發的插件。太爽了。。下面來搭建一把。。

為了使用便捷:

1、首先確保裝了小番茄;

2、禁用字符串和注釋中的拼寫錯誤。

3、安裝visual gdb插件(遠程debug應用,我都是用這個,非常好用)。

4、安裝astyle,配置格式化。

1)、工具-》擴展和更新,搜astyle插件,下載安裝重啟,當前是2.0版本。

2)、工具-》選項-》AStyle Formatter-》Edit,填入下面的,點擊save,確定。

--style=allman --indent=spaces=4 --indent-switches --indent-namespaces --break-blocks --pad-oper --unpad-paren --delete-empty-lines --convert-tabs --mode=c

說明:

--indent=spaces=4   行縮進用4個空格
--indent-switches      switch 與case不同列,case縮進
--indent-cases           縮進case下面的語句,我不喜歡
--break-blocks           空行分隔無關塊
--delete-empty-lines  刪除多余空行
--pad-oper                 操作符兩端出入空格
--unpad-paren           移除括號兩端多余空格
--convert-tabs            tab轉空格

其次,我應該告訴你去看https://blogs.msdn.microsoft.com/vcblog/2017/04/11/linux-development-with-c-in-visual-studio/就好。

注:我猜可能是因為壟斷的原因,vs 2017自帶的跨平台開發或者vs 2015的visual c++ for linux插件遠不如visualgdb好用,它支持make/cmake以及各種profiler,正式開發就應該必備小番茄和visualgdb,效率倍增。本文還是以visual c++ for linux插件為例。

第三,我需要告訴你的是msdn忽略了以及網絡上找不到直接答案的關鍵性信息。安裝好插件以及配置好ssh之后,別忙着測試,否則可以讓你折騰好一會兒。

  • 卸載linux自帶的gdb,下載gdb源碼並編譯安裝gdb以及gdbserver(默認rhel Linux下不帶gdbserver,一般用於嵌入式開發,否則會提示找到gdbserver);

  gdb的安裝可以baidu,唯一需要注意的是,剛從gnu下載的gdb源碼目錄中並沒有gdb/gdbserver這個目錄,configure/make/make install之后,就生成了gdbserver目錄,然后執行make就可以了。

  • 點擊vs debug->linux console調出 linux控制台(否則,vs會卡死在那);
  • 在/etc/ld.so.conf中包含/usr/local/mpc-1.0.1/lib(否則會提示cc1plus: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory)

第四,既然是為了在windows下開發,目標環境是linux,就一定得使用linux下專有特性驗證下確實在linux下運行。

c++代碼,以獲取操作系統和配置信息為例:

#include <iostream>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

void getOsInfo()
{
    FILE *fp = fopen("/proc/version", "r");
    if (NULL == fp)
        printf("failed to open version\n");
    char szTest[1000] = { 0 };
    while (!feof(fp))
    {
        memset(szTest, 0, sizeof(szTest));
        fgets(szTest, sizeof(szTest) - 1, fp); // leave out \n
        printf("%s", szTest);
    }
    fclose(fp);
}

void getCpuInfo()
{
    FILE *fp = fopen("/proc/cpuinfo", "r");
    if (NULL == fp)
        printf("failed to open cpuinfo\n");
    char szTest[1000] = { 0 };
    // read file line by line 
    while (!feof(fp))
    {
        memset(szTest, 0, sizeof(szTest));
        fgets(szTest, sizeof(szTest) - 1, fp); // leave out \n
        printf("%s", szTest);
    }
    fclose(fp);
}

void getMemoryInfo()
{
    FILE *fp = fopen("/proc/meminfo", "r");
    if (NULL == fp)
        printf("failed to open meminfo\n");
    char szTest[1000] = { 0 };
    while (!feof(fp))
    {
        memset(szTest, 0, sizeof(szTest));
        fgets(szTest, sizeof(szTest) - 1, fp);
        printf("%s", szTest);
    }
    fclose(fp);
}


int main()
{
    printf("===os information===\n");
    getOsInfo();

    printf("===cpu infomation===\n");
    getCpuInfo();

    printf("===memory information===\n");
    getMemoryInfo();
    return 0;
}

再看下用戶根目錄下的project。

直接在linux下運行看看是不是生成linux二進制的格式:

大功告成,可以干活了,必須宇宙第一IDE。。。

相關錯誤:

"undefined reference to" 多種可能出現的問題解決方法,除了本文中提及的示例外,常規開發中的引用三方庫等都測試過了,不如引用gperftools的時候就出現這個異常,這是因為so安裝在/usr/local/lib中,但其沒有定義在LD_LIBRARY_PATH中的原因。https://blog.csdn.net/shaderdx/article/details/49929147

編譯的時候找不到三方庫頭文件,在

 

中包含頭文件目錄即可,VC Directories/C++中的用於本地智能提示,https://developercommunity.visualstudio.com/content/problem/40127/additional-include-folders-problems-for-linux-proj.html

gdb提示Loaded 'shared libraries loaded at this time.'. Cannot find or open the symbol file.,如下:

 

程序運行成功,不影響,這應該是gdb自己的設置問題,和vs無關。https://stackoverflow.com/questions/46127228/visual-studio-2017-for-linux-c-cannot-find-or-open-the-symbol-file

引用非標准庫中的so找不到,比如error while loading shared libraries: libmyso.so: cannot open shared object file: No such file or directory。這種情況下,需要確保包含的so在LD_LIBRARY_PATH或者系統庫目錄/usr/lib:/usr/local/lib下,同時加上-L編譯選項,如下:

為什么一定要同時包含呢???仔細測試下了,如果去掉IDE中的-L選項,就會提示:

1> /usr/bin/ld: cannot find -lmyso
1> collect2: error: ld returned 1 exit status

可參考這篇的解釋,但是感覺是其中一種原因:https://www.cnblogs.com/sylar5/p/6701318.html

===============================makefile工程=========================

在實際中,linux工程幾乎95%+都是使用makefile工程,剩下的一部分使用cmake(mysql),所以我們需要能夠直接在VS下開發和調試makefile工程。

1、首先創建makefile項目,如下:

2、創建一個Makefile文件,內容如下:

上圖中的說明參見:https://stackoverflow.com/questions/48454486/debugging-makefile-project-of-linux-development-with-c

3、設置項目屬性:

上圖的說明原因參見:https://github.com/Microsoft/VSLinux/issues/99

 這樣就可以調試makefile工程了。

新補充:在有些情況下,我們沒有主程序的代碼,只有so的代碼,此時要進行調試的話,在gdbserver模式,visual studio是step into so的代碼的,無論是編譯時鏈接的還是通過dlopen動態加載的so都一樣,此時要在visual studio中進行debug,需要改為gdb模式(但是gdb模式不支持控制台交互模式,這要注意)。或者使用visualgdb,visualgdb和vs for linux在使用上還有些差別,后續專門開文講解。

gdb模式(gdbserver沒有這個問題)控制台輸出中文亂碼,但是程序在linux下執行輸出則不是亂碼,linux下的編碼格式為UTF-8。

暫時不知道如何解決?

 

vs for linux box 遠程debug mysql,參考:https://mysqlserverteam.com/compiling-mysql-in-visual-studio-on-a-remote-linux-box/

參考:

https://blogs.msdn.microsoft.com/vcblog/2017/04/11/linux-development-with-c-in-visual-studio/

https://blogs.msdn.microsoft.com/vcblog/2018/04/09/intellisense-for-remote-linux-headers/

https://www.cnblogs.com/coolulu/p/4124803.html

https://docs.microsoft.com/en-us/cpp/linux/configure-a-linux-project


免責聲明!

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



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