如何在Linux上编译Windows Visual C ++代码

时间:2016-06-01 17:41:48

标签: c++ linux compilation makefile

注意:这个问题的目的是找出是否存在一种在VC for Windows中开发的标准方法,并将该代码平滑地移植到Linux上(意思是尽可能少地编写代码)系统,以便它可以编译成可执行文件并运行。

根据我收到的答案,我可以看到存在误解。因此,我打算将这个问题分成两个不同的问题。一个是我原来的(修订后的问题),另一个是我的具体问题以及如何解决它。 (我们会在发布此问题后添加链接。

注意:我对C ++很陌生,并使用makefile进行编译。

我一直在创建一个可以在Linux服务器上运行的C ++程序,到目前为止我一直在使用Visual Studio( Window'当前版本 )编写所有代码。为了安全起见,在我开始编写程序之前,我尝试在VC中创建一些基本的C ++文件,将它们传输到我的服务器,然后用g ++编译它们并运行可执行文件。一切顺利,所以我想:

"嘿,我可以继续写下我的整个计划,按照相同的流程,一切都会好的!"

显然,我错误,这就是我在这里的原因。

当我运行我的makefile时,我遇到了几十个错误,而且我不确定如何处理这种情况。大量的错误消息似乎暗示了我对向量的使用(当然,在使用VC编译时运行正常)。

我已经看过以下问题:

How to compile in Visual Studio 2010 for Linux

Port Visual Studio C++ to Linux

Compiling Visual C++ code in Linux?

但我无法直接找到解决问题的方法(例如我更愿意避免在Linux平台上安装VC而只是在那里工作)。

我也调查了(并尝试使用wineg++但是在编译时似乎没有改变任何内容。

我该如何解决这个问题?

含义:在Windows VC上开发然后移植到Linux是否是常见的做法?如果是这样,是否有确保一切顺利的标准方法?或者只是了解Linux上的编译器如何正常工作和编码以避免错误发生?

最好是一种解决方案,允许我在Windows上继续开发,并在我完成时简单地将所有内容移植到Linux上。如果可能的话,尝试尽可能简单地做出任何答案,当涉及到大部分内容时,我仍然非常业余。

编辑:我还想提一下,我并没有真正使用任何疯狂的库。只需 math.h 向量

错误的一些例子是:

使用一些双精度初始化矢量:

enter image description here

相应的编译错误:

enter image description here

4 个答案:

答案 0 :(得分:5)

只要以可移植的方式编写代码(不使用OS {编译器特定功能,如windows.h或特定的编译器扩展)并使用可移植库,就应该使用Visual Studio和GCC进行编译。

事情是,虽然他们都工作,但他们这样做有点不同。大多数情况下,它可能需要显式覆盖,这是不同的默认设置。举个例子:

  • Visual Studio总是根据他们支持的最新C ++标准进行编译,并且不允许您使用不同的标准。在最新版本中,我认为它几乎是C ++ 11和C ++之间的混合。

  • 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

答案 1 :(得分:1)

如果没有看到确切的错误,很难知道,但是你的错误不是由makefile引起的。编译器并不总是严格遵守标准,有时它们会容忍某些被认为是其他错误的东西。

要看的事情: - C ++ 11 std支持。 Visual Studio自动支持标准的某些功能,而某些(不确定是否所有)版本的gcc要求您显式传递-std = c ++ 11标志。 - 使用嵌套模板时>>。旧版本的gcc在看到类似的内容时会出错:

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

因为他们认为结束是>>运算符。因此,如果您使用旧版本的gcc,请尝试在其间放置一个空格。

即使您的错误可能与makefile构建系统无关,如果您遇到可移植性问题,我仍然会考虑尝试使用cmake。

答案 2 :(得分:1)

您可能还想查看使用VS 2015和Linux Development扩展进行开发和远程调试的可能性。 Visual C++ for Linux Development (March 30, 2016)

答案 3 :(得分:0)

在两台机器(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};会导致编译错误。