簡體   English   中英

如何在Linux上編譯Windows Visual C ++代碼

[英]How to compile Windows Visual C++ code on Linux

注意:這個問題的目的是尋找是否存在用於Windows的VC中開發並將該代碼平穩地移植(意味着對代碼進行盡可能少的編輯)到Linux系統的標准方法。編譯成可執行文件並運行。

根據我收到的答案,我可以看出存在誤解。 因此,我將把這個問題分為兩個獨立的問題。 一個是我的原始問題(修訂后的問題),另一個是我的具體問題以及解決方法。 (發布后,我將在此問題上添加鏈接)。

注意:我對C ++和使用makefile進行編譯是相當陌生的。

我一直在創建一個可以在Linux服務器上運行的C ++程序,到目前為止,我一直在使用Visual Studio( Window的當前版本 )編寫所有代碼。 為了安全起見,在開始編寫程序之前,我嘗試在VC中創建一些基本的C ++文件,將它們轉移到服務器上,然后使用g ++進行編譯並運行可執行文件。 一切都解決了,所以我想:

“嘿,我可以繼續編寫我的整個程序,遵循相同的過程,一切都會好起來的!”

顯然,我錯了 ,這就是為什么我在這里。

運行makefile時,我會遇到很多錯誤,而且我不確定如何處理這種情況。 大量錯誤消息似乎暗示了我對向量的使用(當然,在使用VC編譯時,可以正常運行)。

我看過以下問題:

如何在Visual Studio 2010 for Linux中進行編譯

將Visual Studio C ++移植到Linux

在Linux中編譯Visual C ++代碼?

但是我真的找不到直接解決我的問題的方法(例如,我寧願避免在Linux平台上安裝VC並從那里開始工作)。

我也研究了wineg ++並嘗試使用了它 ),但是在編譯時似乎沒有任何改變。

我應該如何處理這個問題?

含義:在Windows VC上進行開發然后移植到Linux是一種慣例嗎? 如果是這樣,是否有確保一切順利的標准方法? 還是只是知道Linux上的編譯器的工作方式並進行適當的編碼以免發生錯誤?

最好是一種允許我繼續在Windows上進行開發並在完成后將所有內容移植到Linux的解決方案。 另外,如果可能的話,請嘗試使所有答案盡可能簡單。對於大多數此類內容,我還是很業余。

編輯:我還想提到我並沒有真正使用任何瘋狂的庫。 只是math.hvector

錯誤的一些示例是:

用一些雙打初始化向量:

在此處輸入圖片說明

相應的編譯錯誤:

在此處輸入圖片說明

只要您以可移植的方式編寫代碼(不使用Windows / windows.h等操作系統/特定於編譯器的特定功能或特定的編譯器擴展名)並使用可移植的庫,則它應同時與Visual Studio和GCC一起編譯。

問題是,盡管它們都起作用,但它們的工作方式卻有所不同。 通常,它是不同的默認設置,您可能必須顯式覆蓋。 舉個例子:

  • Visual Studio 2017和更高版本默認為C ++ 14。 使用/ std選項可以指定其他標准。

  • GCC具有默認設置,但允許您更改用於編譯的標准。 編譯

     g++ example.cpp 

    使用默認標准(版本6之前的GCC為C ++ 98標准,版本6之后的GCC為C ++ 14)。 您的代碼似乎失敗,因為您使用的是C ++ 11功能,但默認情況下編譯器使用的是較舊的標准。

     g++ -std=c++11 example.cpp 

    應該通過明確指定標准(在本例中為C ++ 11標准)使您的某些錯誤消失。

這些只是編譯器選擇的不同折衷。 僅支持一種標准可能會使支持和修復錯誤更加容易,因為您沒有不同的編譯器+標准版本組合,這些組合可能具有不同的錯誤。 能夠更改用於編譯的標准可以更輕松地測試程序是否可以在新標准下正常運行,或者必須修復哪些重大更改等。

總的來說,GCC至少是最小的,如果您希望它做一些額外的事情,您是否可以明確指定它。 我建議使用類似:

g++ -Wall -Wextra -pedantic -std=c++11 example.cpp

使用-Wall-Wextra給出一個不錯的警告級別,以-pedantic告訴您是否要使用有效但會降低代碼可移植性的編譯器擴展,最后但同樣重要的是,您應始終指定標准您想使用-std=c++11-std=c++14或更舊的-std=c++98

您可能還想了解使用VS 2015和Linux開發擴展進行開發和遠程調試的可能性。 用於Linux開發的Visual C ++(2016年3月30日)

沒有看到確切的錯誤很難知道,但是很可能您的錯誤不是由於makefile引起的。 編譯器並不總是嚴格遵守該標准,有時它們可​​以容忍某些被認為是其他錯誤的事情。

要看的東西:-C ++ 11 std支持。 Visual Studio自動支持該標准的某些功能,而某些gcc版本(不確定是否所有版本)要求您顯式傳遞-std = c ++ 11標志。 - >>使用嵌套模板時。 舊版gcc在出現類似以下內容時會給出錯誤消息:

std::vector<std::pair<bool,bool>>

因為他們認為結尾是>>運算符。 因此,如果您使用的是舊版的gcc,請嘗試在兩者之間放置一個空格。

即使您的錯誤可能與makefile生成系統無關,如果您仍然遇到可移植性問題,我仍會考慮嘗試cmake。

在兩台計算機(Windows和Linux)中,打開一個終端,然后鍵入“ g ++ --version”和“ gcc --version”,以確保您使用的是相同的編譯器版本,這可能與您的問題無關,但是值得看。 我認為您的問題是初始化的語法。 我以前從未僅通過使用變量名和方括號來初始化std :: vector。 據我所知,您的聲明不包括類型。 我使用TDM g ++ 5.1測試了這兩種方式。 和留出std::vector<double>std::vector<double> WiHm = {4.71,0.33,0.52,0.066}; 導致編譯器錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM