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

新手上路,请多包涵

注意:这个问题的目的是找出是否存在在 VC for Windows 中开发的标准方法,并将该代码顺利移植(意味着对代码进行尽可能少的编辑)到 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

一些错误示例如下:

用一些双精度数初始化向量:

在此处输入图像描述

对应的编译错误:

在此处输入图像描述

原文由 Paul Warnick 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 904
2 个回答

只要您以可移植的方式编写代码(不使用操作系统/编译器特定的功能,如 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

原文由 AliciaBytes 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果没有看到确切的错误,很难知道,但您的错误可能不是由于 makefile 造成的。编译器并不总是严格遵守标准,有时他们会容忍某些被认为是错误的事情。

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

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

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

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

原文由 technik 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题