VisualStudio(vs)開發linux程序配置

VisualStudio(vs)開發linux程序配置

  • 在開始之前,強烈建議閱讀官方文檔,或許問題就已經解決了
  • 官方文檔:https://docs.microsoft.com/zh-cn/cpp/linux/download-install-and-setup-the-linux-development-workload?view=vs-2017

遠程linux環境

  • 爲了能遠程上linux並調試,需要在linux上安裝如下工具:gcc、gdb、rsync、zip、make、openssh-server、cmake
  • 在ubuntu上則按如下命令安裝
sudo apt-get install openssh-server g++ gdb make rsync zip
sudo service ssh start

在這裏插入圖片描述

頭文件智能提示

  • 默認情況下雖然可以遠程編譯通過,但在vs2017上並沒有智能提示,多了好多波浪線,看着就很不舒服(據說在linux上安裝了zip工具後vs就會自動將頭文件壓縮複製到windows本地然後提供智能提示,反正我是沒享受到,因此只能手動拷貝了)
  • 爲了解決這個頭文件的問題,需要將目標主機即linux上的頭文件拷貝到本地,做法如下
  • 首先將遠程linux上的/usr/include裏的所有文件拷貝到windows本地
  • 之後在vc++目錄裏的包含目錄配置下拷貝過來的文件的目錄
    在這裏插入圖片描述
  • 這樣波浪線就消失了,而且可以跳轉到定義了

工程配置

  • 首先要修改下遠程根目錄,如下圖
  • 注意,默認是~/projects,表示在用戶目錄的projects下,但是這個~會導致奇怪的問題,因此我們最好爲其指定一個明確的路徑,如我這裏就放在/root/projects下了
  • 在這裏插入圖片描述

第三方靜動態庫和頭文件的使用

  • 第三方庫的使用涉及到文件的複製問題,建議先看下官方文檔關於複製源的說明,地址如下
    • https://docs.microsoft.com/zh-cn/cpp/linux/prop-pages/copy-sources-project?view=vs-2017

路徑配置

  • 假如工程引用了第三方的靜動態庫(自然包含頭文件了),那麼怎麼辦呢
  • 項目中的源文件vs會幫我們自動拷貝到linux上(路徑就是$(RemoteRootDir)/$(ProjectName)),因此我們得手動將庫和頭文件拷到linux存放源文件的地方,在本例中
  • $(RemoteRootDir)=/root/projects;
  • $(ProjectName)=ffmpeg_decode;
  • 靜動態庫和頭文件分別放在lib和include文件夾裏,示例如下
-/
  -root
    -projects
      -ffmpeg_decode
		-xxx.cpp
		-lib
		  -xxx.a
		-include
		  -xxx.h
  • 然後配置包含目錄,如下圖,第一個路徑主要是給linux上用的,這個路徑要根據實際設置(即linux上的路徑),第二個路徑則是給vs上用的(即windows本地的路徑)
  • 在這裏插入圖片描述
  • 頭文件配完了,接下來需要配置第三方庫
  • 打開鏈接器,在常規下配置linux上庫的路徑,在輸入上配置庫的名稱,如下圖
  • 在這裏插入圖片描述
  • 在這裏插入圖片描述
  • 以上因爲主要是在linux上編譯,因此常規庫裏的附加庫目錄只是配置了在linux上的路徑,在本示例中是$(RemoteRootDir)/$(ProjectName)/lib
  • 輸入則是配置庫的名稱,本示例中由於引用的是ffmpeg的庫libavcodec.a,libavformat.a等庫,故配上avcode,avformat等(前綴和後綴不用寫)

文件複製

  • 路徑都配置好了之後,接下來就是文件的拷貝了,即將第三方庫和頭文件拷貝到我們之前的路徑配置,使之相對應
  • 你可以直接將文件手動複製到linux上對應位置,但這樣有個問題,就是vs上工程在清理後遠程所有文件都消失了,又必須得重新手動拷貝,這樣太麻煩了,因此必須尋求自動複製的方案,如下
  • 如果文件比較少,那麼可以直接在配置屬性的複製源裏添加即可,如圖
  • 在這裏插入圖片描述
  • 這樣在運行時就會將windows本地的文件複製到linux上指定目錄了,本例展示了靜態庫.a的複製,其他文件也是如此
  • 但是有可能文件太多了,一個一個這樣寫也太麻煩了,幸運的是官方對此有一定解決方案,如下圖
    在這裏插入圖片描述
  • 於是打開項目的vcxproj文件,將要複製的東西添加如下
<?xml version="1.0" encoding="utf-8"?>
<Project>
	...
  <ItemGroup>
   <MyLibItems Include="lib/**" />
   <DataFilesToCopyRemotely Include="@(MyLibItems)" />
  </ItemGroup>
  <ItemGroup>
   <MyIncludeItems Include="include/**" />
   <DataFilesToCopyRemotely Include="@(MyIncludeItems)" />
  </ItemGroup>
</Project>
  • 保存後再試試吧,文件在遠程時本地的就會被複制過去了

其他

  • 當程序有日誌輸出時,我們只能在linux控制檯才能看到,如下
  • 在這裏插入圖片描述

ffmpeg開發

  • 可能會報pthread相關的錯誤,因此需要我們將pthread鏈接過去(-lpthread,其中l是L的小寫,並不是i的大寫I,真是討厭,這兩個看起來是一模一樣的),如下
    在這裏插入圖片描述
  • 可能會報ffmpeg庫裏的很多函數未定義,這個主要是由於庫的依賴導致的,將被依賴的放在依賴的前面即可,如avformat依賴了avcodec,因此要放在avcodec的前面,如圖
  • 在這裏插入圖片描述

參考

Visual Studio 2017:Linux C++ 開發教程(WSL篇)_運維_貓科龍-CSDN博客\nhttps://blog.csdn.net/maokelong95/article/details/64523303/

使用Visual Studio 2017開發Linux程序 - dchao - 博客園
https://www.cnblogs.com/dongc/p/6599461.html

vs2017 編譯C++ 生成linux下可運行的.out文件_運維_QuanWaiRen0的博客-CSDN博客
https://blog.csdn.net/QuanWaiRen0/article/details/80697154

Linux下undefined reference to ‘pthread_create’問題解決_運維_jiangxinyu的專欄-CSDN博客\nhttps://blog.csdn.net/jiangxinyu/article/details/7778864

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章