如何编写C++;可以在Linux和Windows中轻松编译的程序? 我正在编写一个C++程序。< /P> 我最大的烦恼是C++的平台无关性。 你可能知道在Windows和Windows 1到Linux上编译Linux C++程序是不太可能的,没有大量的错误和平台特定的文件。

如何编写C++;可以在Linux和Windows中轻松编译的程序? 我正在编写一个C++程序。< /P> 我最大的烦恼是C++的平台无关性。 你可能知道在Windows和Windows 1到Linux上编译Linux C++程序是不太可能的,没有大量的错误和平台特定的文件。,c++,c,windows,linux,platform,C++,C,Windows,Linux,Platform,当然,您总是可以切换到一些模拟,如Cygwin和wine,但我问您,真的没有其他方法吗?在Windows中编译,然后再在Linux中编译。除非您使用特定于平台的库,否则它应该可以工作。它不像Java,只需编译一次,就可以在任何地方工作。没有人为C++制作虚拟机,而且可能永远不会。您在C++中编写的代码将在任何平台上运行。你只需要在每个平台上编译它。 < P>语言本身是跨平台的,但是大多数库不是,但是如果你想在C++编程时完全跨平台,你应该记住三件事。 首先,您需要开始使用某种跨平台构建系统,如。

当然,您总是可以切换到一些模拟,如Cygwin和wine,但我问您,真的没有其他方法吗?

在Windows中编译,然后再在Linux中编译。除非您使用特定于平台的库,否则它应该可以工作。它不像Java,只需编译一次,就可以在任何地方工作。没有人为C++制作虚拟机,而且可能永远不会。您在C++中编写的代码将在任何平台上运行。你只需要在每个平台上编译它。

< P>语言本身是跨平台的,但是大多数库不是,但是如果你想在C++编程时完全跨平台,你应该记住三件事。 首先,您需要开始使用某种跨平台构建系统,如。其次,您需要确保所使用的所有库都是跨平台构建的。 还有第三点,我建议您使用存在于所有目标平台上的编译器(C++是一个相当复杂的野兽,所有编译器都有自己的特殊怪癖)

我有一些关于图形用户界面的进一步建议。有几种可供使用,其中三种最值得注意的是:

两个API都有自己的小部件集(按钮、列表等),而更多的是当前运行的平台本地小部件集的包装API。这意味着前两个与系统的其他部分相比可能有点不同,而后一个看起来就像本地程序

如果你对游戏编程感兴趣,那么有同样多的API可供选择,它们都是跨平台的。据我所知,功能最全的两个是:

两者都包含从图形到输入和音频的所有程序,无论是通过插件还是内置程序

也可以,如果您觉得C++中的标准库有点不足,请查看一些通用的跨平台甜度。


祝你好运。

C++是跨平台的。您似乎遇到的问题是,您正在使用依赖于平台的库

我假设您真的在谈论UI组件集——在这种情况下,我建议使用GTK+、Qt或wxWindows之类的东西——每个组件都有可以为不同系统编译的UI组件

唯一的解决方案是查找和使用与平台无关的库


另一方面,cygwin和Wine都不是仿真——它们都是各自系统中相同功能的100%本地实现。

创建一些底层,其中包含项目中所有特定于平台的代码。使用相同的接口实现该层的两个版本—一个用于Windows,一个用于Linux—并将它们构建为两个库。通过该界面访问项目中所有特定于平台的功能

该层可以包含用于文件访问、打印、GUI等的通用类


使用该层的所有(现在非平台特定的)代码现在可以在Windows上编译一次,并且在Linux上一次编译。

< p>坚持ANSI C++和跨平台的库,并且应该是好的。

建议:

  • 将typedef用于int。或者#包括。有些机器认为int是8字节,有些是4字节。(过去是2和4。时代是如何变化的。)

  • 尽可能使用封装。我上一个窗口的编译器认为%lld是%I64d”,为vsnprintf()提供了扭曲的返回值,close()和sockets等类似问题

  • 注意堆栈大小/缓冲区大小限制。我在Windows下遇到了8k UDP缓冲区限制,以及其他问题

  • <> L> > P>由于某些原因,我的窗口的C++编译器不会接受栈中的动态大小分配。例如:Vo.Foo(int A){int b[a];}注意这些事情。计划如何重新编码。< /P>
  • #ifdef可以是你最好的朋友。也是你最坏的敌人!(同时!)


这当然可以做到。但要尽早并经常编译和测试!

标准C++是代码在任何平台上编译都不会出错。 尝试在windows上使用流血的Dev C++(而不是VC++/Borland C++)


血型DEVC++对C++标准进行了确认,所以编译后的程序在Linux上编译,在大多数情况下都没有错误。


请参阅文章:

一旦你意识到了问题的症结所在,其实并不难。我目前正在编写的所有代码都是在32位和64位Windows、所有版本的Linux以及Unix(Sun、HP和IBM)上编译的。显然,这些不是GUI产品。此外,我们不使用第三方库,除非我们自己编译它们

我有一个.h文件,其中包含所有特定于编译器的代码。例如,Microsoft和gcc在如何指定8位整数方面存在分歧。因此,在.h文件中,我有

#if defined(_MSC_VER)
   typedef __int8 int8_t;
 #elif defined(__unix)
   typedef char int8_t;
 #endif
还有相当多的代码统一了某些较低级别的函数调用,例如:

#if defined(_MSC_VER)
  #define SplitPath(Path__,Drive__,Name__,Ext__) _splitpath(Path__,Drive__,Dir__,Name__,Ext__)
#elif defined(__unix)
  #define SplitPath(Path__,Drive__,Name__,Ext__) UnixSplitPath(Path__,Drive__,Name__,Ext__)
#endif
现在,在本例中,我相信我必须编写一个UnixSplitPath()函数-有时您需要这样做。但大多数情况下,您只需要找到正确的替换函数。在我的代码中,我将调用SplitPath(),尽管这两种平台上的函数都不是本机函数;#defines会帮我解决它。训练自己需要一段时间

信不信由你,我的.h文件只有240行长