2012-01-03 6 views
7

Si le code compilé par un compilateur C++ visuel est en C++, pourquoi avez-vous besoin d'un paquet redistribuable? Est-ce que cela rend votre plateforme de code dépendante? Est-ce que l'utilisation du compilateur visuel C++ avec le paquet redistribuable offre un avantage par rapport à l'utilisation d'un autre IDE avec g ++?Pourquoi le package redistribuable Visual C++ est-il requis?

+2

code compilé est * toujours * dépendant de la plateforme. Il fonctionne sur, et seulement sur, la plate-forme pour laquelle il a été compilé. –

+1

Ce n'est pas obligatoire. Vous devriez créer un projet d'installation à la place. Ou compilez avec/MT au lieu de/MD donc vous n'en avez pas du tout besoin. Risques cependant quand vous utilisez des DLL. –

Répondre

6

Le code ne dépend pas de la plate-forme, le exécutable qui en résulte est. Il est lié aux bibliothèques MS avec l'implémentation de la bibliothèque standard, qui sont inclus dans le redistribuable en tant que DLL. IIRC il devrait y avoir une option pour la liaison statique de tout, de sorte que vous n'ayez pas besoin du redistribuable supplémentaire, mais le binaire résultant serait toujours dépendant de la plate-forme - par exemple vous ne pouvez pas exécuter un binaire Windows sur UNIX système (sans WINE au moins).

+2

Vous avez le choix d'inclure le gestionnaire de mémoire, la bibliothèque d'E/S standard, et une copie distincte dans chaque application, sans aucun moyen de la gérer et de la mettre à niveau et de surcharger, ou d'installer un seul temps qui contient tout ce code une fois pour chaque application qui pourrait en avoir besoin. –

+0

@DavidSchwartz ouais ... Et je pense que c'est inclus par défaut avec toutes les installations de Windows, n'est-ce pas? – littleadv

+1

Cela dépend de l'installation de Windows et de l'heure d'exécution. Une nouvelle installation de Windows Vista SP1, par exemple (si quelqu'un l'installe encore) n'aura pas l'exécution VS2010. –

5

Il n'existe pas de "Straight C++". Il y aura toujours des fonctions de bibliothèque que vous appelez ici et là dans votre code, et même si vous êtes très prudent, il y aura certaines fonctions qui devront être appelées simplement par le code émis par le compilateur. Par exemple, si vous avez la boucle suivante:

for(int i = 0; i < count; i++) 
    array1[i] = array2[i]; 

Le compilateur remplacer par un code qui copie simplement la mémoire sur. Et si vous compilez pour une taille plus petite au lieu de la vitesse, ce sera un appel à une fonction très semblable à memmove(). De plus, vous pouvez avoir des opérations en virgule flottante pour lesquelles il n'existe pas d'instructions x86 équivalentes directes; ceux-ci seront également mis en œuvre avec des appels de fonction. Et la liste continue. Cela ne rend pas votre plate-forme de code dépendante, car sur une plate-forme différente, le compilateur de ce plafrom compilera le même code que le vôtre pour s'adapter à l'environnement d'exécution C++ de cette plate-forme. Heureusement, il n'est pas nécessaire que l'environnement d'exécution C++ soit une entité distincte de votre application. Vérifiez les options du compilateur et de l'éditeur de liens. vous devriez être capable de produire un seul exécutable qui contient les deux. Si vous avez trouvé que g ++ ne nécessite pas de runtime séparé, c'est parce qu'il le fait par défaut.

1

Le C++ redistribuable sont spécifiques à l'IDE que vous utilisez (« IDE » Je dis, mais c'est vraiment spécifique au compilateur, mais le compilateur IDE & sont tous deux nouvelles versions affecté que les choses se déplacent le long.)

Il est rendu spécifique à cet IDE, mais pas au système d'exploitation Win. Donc, il devrait être rétrocompatible (en supposant que vous n'utilisez pas de nouvelles API, évidemment.) En fait, cela est fait pour qu'il soit rétrocompatible (et non l'inverse comme vous le pensez.) Cela vous permet d'utiliser les dernières meilleure version de l'IDE (10, 11, 12 ...) et toujours exécuter votre code sur Win2k! Maintenant, bien sûr, c'est très différent de Linux où vous êtes censé recompiler sur chaque version principale de toute façon. La plupart des systèmes Unix fonctionneront de cette manière.

Je ne connais pas un moyen de compiler C++ statiquement afin de pouvoir éviter ces redistribuables. C'est peut-être possible, même si cela rendrait certainement votre fichier .exe très gros.

0

Je garde toujours une copie de Visual C++ 6 installé sur une machine virtuelle xp (Ne fonctionnera pas correctement dans Win 6/7/8). Parfois, j'écris ou je suis invité à écrire une application utilitaire pour faire quelque chose rapidement et/ou une fois que je compile comme un seul exe.J'en ai eu marre d'envoyer un simple programme écrit en utilisant seulement la lib de std à quelqu'un d'autre seulement pour qu'ils me disent que ça ne marche pas à cause d'une DLL manquante ou d'un paquet redistribuable.

Questions connexes