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

10

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

根据我收到的答案,我可以看出有一个误解。因此,我将把这个问题分成两个单独的问题。一个是我的原始问题(修改后的问题),另一个是我的具体问题及其如何解决。(一旦发布链接,我将添加到这个问题中。)

注意:我对C++和使用makefiles进行编译都很新手。

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

“嘿,我可以继续编写我的整个程序,按照相同的过程,一切都会没问题!”

显然,我是错了,这就是为什么我来到这里的原因。

当我运行我的makefile时,我得到了很多错误,并且我不太确定如何解决这种情况。许多错误信息似乎在暗示我使用向量(当然,在VC编译时运行良好)。

我查看了以下问题:

如何在Visual Studio 2010中为Linux进行编译

将Visual Studio C++移植到Linux

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

但我并没有找到解决问题的直接方法(例如,我更希望避免在 Linux 平台上安装 VC 并从那里开始工作)。

我还尝试使用wineg++,但似乎编译没有任何变化。

应该如何解决这个问题?

意思是:在 Windows 上开发 VC 然后迁移到 Linux 是很常见的做法吗?如果是,是否有一种标准方法确保一切顺利?还是只需要了解 Linux 上的编译器如何工作并适当编码以避免出现错误?

最好的解决方案是,允许我在 Windows 上继续开发,然后在完成后将所有内容迁移到 Linux。如果可能的话,请尽量简单易懂地回答,因为我在大多数这方面的知识方面仍然是非常业余的。

编辑:我也想提到我没有使用任何疯狂的库。只有 math.hvector

一些错误的示例:

使用一些 double 初始化向量:

enter image description here

对应的编译错误:

enter image description here


6
我会考虑使用CMake来生成你在Linux和Visual Studio中的项目文件。 - drescherjm
3
你能重新表达你的问题并完全删除“Paul Warnick生平”这一部分吗?我们真的对此不感兴趣。请提供您遇到的错误描述、相关代码和编译命令。 - SergeyA
2
卷起袖子:逐个修复错误。然后打开-Wall -Wextra并修复这些警告。还要注意您正在构建的C++标准,尽管使用比原始标准更新的标准不应该引起问题(假设代码是一些标准的C++)。 - hyde
1
然后设置一个CI系统,每次提交代码时都会构建软件(在本地Linux VM上运行Jenkins可能是最简单的方法),这样您就可以保持代码跨平台。添加自动化测试以确保它真正有效。 - hyde
2
建议不要使用图片,而是直接粘贴文本。如果这些图片链接被打乱或失效,问题的可读性就会受到影响。关于添加编译器标志,很难在没有看到您的 makefile 布局的情况下给出具体建议,但最终结果应该类似于 g++ -std=c++11 <一堆其他选项> example.cpp - user4581301
显示剩余8条评论
4个回答

8
只要您以可移植的方式编写代码(不使用特定于操作系统/编译器的功能,如windows.h或特定于编译器的扩展),并使用可移植库,它应该可以在Visual studio和GCC上编译。
问题是虽然它们都能工作,但它们的工作方式略有不同。主要是不同的默认设置,您可能需要明确地覆盖它们。例如:
  • Visual Studio 2017 and later defaults to C++14. Use the /std option to specify a different standard.

  • GCC has a default set, but allows you to change the standard you use for compilation. Compiling with

    g++ example.cpp
    

    uses the default standard (C++98 standard for GCC before version 6 and C++14 for GCC after version 6). Your code seems to fail because you use C++11 features but your compiler uses an older standard by default.

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

    should make some of your errors disappear by explicitly specifying the standard, in this case C++11 standard.

这些只是编译器所选择的不同权衡。仅支持一种标准可能使支持和修复错误更容易,因为您不会有可能具有不同错误的不同编译器+标准版本组合。能够更改编译使用的标准可以更轻松地测试程序是否与新标准配合良好或者需要修复哪些破坏性变化等...
总的来说,GCC更多的是最小化,如果要执行一些额外的操作,则需明确指定。我建议使用类似以下内容:
g++ -Wall -Wextra -pedantic -std=c++11 example.cpp

使用-Wall-Wextra可以得到一个不错的警告级别,-pedantic会告诉你是否尝试使用编译器扩展,这样会使你的代码更加不可移植。最后但并非最不重要的是,你应该始终指定你想要使用的标准,无论是-std=c++11-std=c++14还是较旧的-std=c++98


1
我想指出,我不得不使用标志“-std=c++0x”。 - Paul Warnick

2

1

没有看到具体错误很难知道问题出在哪里,但是你的错误可能不是由makefile引起的。编译器并不总是严格遵守标准,有时会容忍一些被认为是错误的东西。

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

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

因为他们认为那个结束符是>>操作符。所以如果你使用旧版本的gcc,尝试在它们之间加上空格。
即使您的错误可能与makefile构建系统无关,如果您在可移植性方面遇到问题,我仍然建议尝试使用cmake。

其实,这是我遇到的其中一个错误,但我设法删除了所有出现的情况。我将编辑我的问题以发布一些我正在收到的错误消息。 - Paul Warnick

0
在两台机器(Windows 和 Linux)中,打开终端并键入“g++ --version”和“gcc --version”,以确保您正在使用相同的编译器版本,这可能与您的问题无关,但值得一看。我认为你的问题是初始化语法。我以前从未通过仅使用变量名和括号来初始化std::vector。据我所知,您的声明不包括类型。我使用我的TDM g++ 5.1测试了两种方法,并从std::vector<double> WiHm = {4.71,0.33,0.52,0.066};中省略了std::vector<double>,导致编译器错误。

我确信我没有在Windows上使用g++/gcc进行编译,只是使用VC附带的标准编译器,但我会尝试一下! - Paul Warnick
1
如果您正在使用Visual Studio,这实际上可能不起作用,因为我认为它不使用g++(您在我写这个评论时说的)。我很乐意发布有关如何在Windows中使用TDM gcc/g++和Netbeans的教程。 - ThisGuyCantEven
1
我认为@technik也指出了一些东西,通常我需要像他发布的那样声明我的std向量。例如:using namespace std; vector WiHm = {4.71,0.33,0.52,0.066}; - ThisGuyCantEven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接