如果Visual C ++编译器编译的代码是直接的C ++,为什么还需要一个可再发行的包呢?这会使您的代码平台依赖吗?将可视化C ++编译器与可再发行组件包一起使用是否比使用其他IDE和g ++更有优势?
答案 0 :(得分:8)
代码不依赖于平台,生成的可执行文件是。它使用标准库实现链接到MS库,它们作为DLL包含在可再发行组件中。
IIRC应该有一个静态链接所有内容的选项,这样你就不需要额外的可再发行组件了,但是生成的二进制文件仍然依赖于平台 - 例如你不能在UNIX系统上运行windows二进制文件(至少没有WINE)。答案 1 :(得分:5)
没有“Straight C ++”这样的东西。在你的代码中总会有一些你在这里和那里调用的库函数,即使你非常小心,也会有一些函数只需要由编译器发出的代码调用。例如,如果您有以下循环:
for( int i = 0; i < count; i++ )
array1[i] = array2[i];
编译器会将其替换为只复制内存的代码。如果你正在编译较小的大小而不是速度,这将是一个非常像memmove()的函数调用。
此外,您可能有一些浮点运算,没有直接的x86等效指令;这些也将通过函数调用实现。名单还在继续。
这不会使您的代码平台依赖,因为在不同的平台上,该plafrom的编译器将编译您的相同代码以与该平台的C ++运行时一起使用。
幸运的是,C ++运行时不必是与应用程序分离的实体。检查编译器和链接器选项;您应该能够生成包含两者的单个可执行文件。如果您发现g ++不需要单独的运行时,那是因为它默认情况下完全相同。
答案 2 :(得分:1)
C ++可再发行组件特定于您正在使用的IDE(我称之为“IDE”,但这非常特定于编译器,但随着事情的发展,IDE和编译器都被分配了新版本。)
它特定于该IDE,但不适用于Win OS。所以它应该是向后兼容的(假设你显然没有使用新的API。)实际上,这样做是为了向后兼容(而不是你想的其他方式。)这允许你使用最新的最好的IDE版本(10,11,12 ......),仍然在Win2k上运行你的代码!
现在,当然,它与Linux有很大的不同,无论如何你都希望在每个主版本上重新编译。大多数Unix系统都会以这种方式工作。
我不知道一种静态编译C ++的方法,以便能够避免这些可再发行组件。它有可能,虽然它肯定会使你的.exe非常大。
答案 3 :(得分:0)
我总是在xp虚拟机上安装Visual C ++ 6的副本(在Win 6/7/8中无法正常工作)。有时候我写或者被要求编写一个实用程序应用程序来快速执行某些操作和/或一次性编译为单个exe。我厌倦了将仅使用std lib编写的简单程序发送给其他人,只是为了告诉我它因为一些丢失的dll或可重新分发的包而无效。
答案 4 :(得分:0)
在项目属性中,C / C ++,代码生成将运行时库设置为/ MT,用于发布版本。
(Mike Danes的回复,他在social.msdn上回答了这个问题:https://social.msdn.microsoft.com/Forums/vstudio/en-US/09afd4be-7a15-4772-98c1-a0464a96cd7f/how-to-static-linkage-in-visual-c-express-edition-2010?forum=vcgeneral&prof=required)