可以在Mac OS X或Linux上编译和运行Visual C ++程序吗?

时间:2011-09-22 14:08:08

标签: c++ macos visual-c++ osx-snow-leopard

......如果是的话,怎么样?

具体来说,我想在Mac OS X Snow Leopard 10.6.8上编译并运行wavdiff。据我所知(这不是很远,因为我是C ++的新手),这是用MS Visual C ++或类似的东西创建的。

我非常感谢能够解决在Mac OS X或Linux上编译Visual C ++程序的一般情况的答案,并且还解决了上述特定挑战。

3 个答案:

答案 0 :(得分:4)

C ++语言是可移植的。从理论上讲,C ++源代码可以编译为在任何平台上运行。

但是,有一些需要注意的注意事项:

  • 在不同平台上的行为可能会有所不同。 C ++标准留下了许多实现定义的东西,这意味着它取决于单个平台和编译器应该如何表现。例如,常见数据类型的大小可以(并且将)在不同平台上变化。在{64} Linux上,long通常为64位宽,但在64位Windows上仅为32位。 Windows上wchar_t为16位宽,但Linux上通常为32位。因此,如果您的代码对实现定义的行为做出假设,那么它可能不是可移植的(一个典型的例子是假设指针可以存储到intunsigned int中的代码。 32位机器,但在64位上,你最终试图将64位数据存储到32位宽的对象中。
  • 即使您的代码是可移植的,您的依赖关系也可能不是。最明显的例子当然是OS API。使用Win32 API的代码无法在不可用的平台(Windows以外的任何位置)上编译。依赖于POSIX API的代码如果不可用则不会编译(Windows支持某些POSIX API,但远非所有)。
  • C ++可能意味着很多不同的东西。有ISO标准化语言,便携式,然后是个别编译器理解的方言。 Visual C ++,GCC和任何其他主要的C ++编译器允许一组不属于标准的语言扩展,并且可能不允许在不同的编译器上使用。如果您的代码依赖于那些代码,则可能无法使用其他编译器进行编译。 (例如,Visual C ++允许非const引用绑定到临时,严格说来不允许,其他编译器会拒绝它。默认情况下,GCC允许在堆栈上分配动态大小的数组,这也是非标准扩展,其他编译器将拒绝。)

所以这取决于代码,真的。干净,高质量的代码往往便携,没有什么问题。当然,对于直接依赖于OS服务的部分,必须为不同的OS重写(或者可以使用跨平台的包装器/库,可以用于以可移植的方式执行相同的操作)

答案 1 :(得分:3)

此程序无法轻松移植(在没有源更改的情况下重新编译)。至少没有改变源。它包含对Windows库的依赖性,并且在某些部分与Windows API绑定。

问题不在于它是用VC ++编写的,而是它具有这些依赖性。编译为无平台依赖关系的程序可以通过在目标平台上重新编译或使用交换机定位到不同的平台来轻松移植。

答案 2 :(得分:2)

仅基于此源文件,看起来代码本身可能是合理的可移植C ++。问题是它(或它使用的任何类)是否使用了那些在其他平台上不存在的Windows API。您可以做的赌注是询问作者他们的想法,或者只是尝试一下。