注意:这个问题的目的是找出是否存在在 VC for Windows 中开发并将该代码顺利移植(意味着尽可能少地编辑代码)到 Linux 的标准方法系统,以便它可以编译成可执行文件并运行。
根据我收到的答复,我可以看出存在误解。因此,我要把这个问题分成两个单独的问题。一个是我原来的(修改后的问题),另一个是我的具体问题以及如何解决它。 (一旦发布,我将添加指向该问题的链接)。
注意:我对 C++ 和使用 makefile 进行编译还很陌生。
我一直在创建一个将在 Linux 服务器上运行的 C++ 程序,到目前为止我一直在使用 Visual Studio(Window 的当前版本)编写所有编码。为了安全起见,在开始编写程序之前,我尝试在 VC 中创建一些基本的 C++ 文件,将它们传输到我的服务器,然后用 g++ 编译它们并运行可执行文件。一切顺利,所以我想:
“嘿,我可以继续编写我的整个程序,遵循相同的过程,一切都会好起来的!”
很明显,我错了,这就是我来这里的原因。
当我运行我的 makefile 时,我遇到了很多错误,我不确定如何处理这种情况。大量错误消息似乎在暗示我使用了 vector (当然,用 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 和 vector。
一些错误的例子是:
用一些 double 初始化一个 vector :
对应的编译错误:
最佳答案
只要您以可移植的方式编写代码(不使用操作系统/编译器特定的功能,如 windows.h
或特定的编译器扩展)并使用可移植的库,它应该在 Visual Studio 和海湾合作委员会。
问题是,虽然它们都有效,但它们的工作方式略有不同。大多数情况下,它是不同的默认设置,您可能必须明确覆盖这些设置。例如:
Visual Studio 2017 及更高版本默认为 C++14。使用 /std指定不同标准的选项。
GCC 有一个默认设置,但允许您更改用于编译的标准。编译
g++ example.cpp
使用默认标准(GCC 版本 6 之前的 C++98 标准和版本 6 之后的 GCC 的 C++14)。您的代码似乎失败了,因为您使用了 C++11 功能,但您的编译器默认使用旧标准。</p>
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
。
关于c++ - 如何在 Linux 上编译 Windows Visual C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37575454/