Dupliqué possible: strong>
Obtenez le chemin de l'exécutable P>Je suis la programmation sur Windows à l'aide de Mingw, GCC 4.4.3. Lorsque j'utilise la fonction principale comme ceci: p>
xxx pré> sur Windows, je reçois un chemin complet comme ceci: "C: / Dev / Stuff / Bin / Test". Lorsque j'exécute la même application sur Linux, cependant, je reçois une sorte de chemin relatif: "bin / test". Ça brise ma candidature! Aucune idée sur la façon de vous assurer que le chemin est absolu sur les deux systèmes? P> BlockQuote>
3 Réponses :
Non, il n'y a pas. Sous la plupart des coquillages sur Linux, Par exemple, un programme avec plusieurs commandes de ligne de commande différentes peut installer le binaire une fois, puis link dur em> les différents différents commandes au même binaire. Par exemple, sur mon système: p> remarque comment certains de ces fichiers ont exactement la même taille. Plus d'enquête révèle: P> argv [0] code> contient exactement ce que l'utilisateur saisit em> pour exécuter le binaire. Cela permet aux binaires de faire différentes choses en fonction de ce que les types d'utilisateurs.
$ stat /usr/bin/git
234881026 459240 -rwxr-xr-x 109 root wheel 0 2500640 "Oct 29 08:51:50 2011" "May 16 18:44:05 2011" "Jul 26 20:28:29 2011" "May 16 18:44:05 2011" 4096 4888 0 /usr/bin/git
$ stat /usr/bin/git-receive-pack
234881026 459240 -rwxr-xr-x 109 root wheel 0 2500640 "Oct 29 08:51:50 2011" "May 16 18:44:05 2011" "Jul 26 20:28:29 2011" "May 16 18:44:05 2011" 4096 4888 0 /usr/bin/git-receive-pack
Sans oublier que quel que soit le code qui appelle l'une des familles de fonctions EXEC * CODE> de fonctions pour exécuter votre code peut mettre tout ce qu'il veut pour
argv [0] code>.
Il n'y a aucun moyen de s'assurer que Cela semble être un bogue dans l'exécution de Mingw si lorsque vous invoquez le programme à partir d'une invite de commande via argv [0] code> est un chemin absolu car il est censé être exactement comment l'utilisateur a appelé le programme. Donc, si sur une ligne de commande Linux, vous appelez votre programme via
./ bin / test code>, alors
argv [0] code> devrait être exactement
"./ bin / test " code>. p>
. \ bin \ test code>,
argv [0] code> est
"C: / Dev / Stuff / Bin / Test" Code>. Avec la dernière MINGW (Version GCC 4.5.2), appeler une binaire via
. \ Bin \ test code> signifie
argv [0] code> est
". \ Bin \ test " code>. Un binaire (CL version 16.00.40219.01 de Microsoft Visual C ++) invoqué via
. \ Bin \ test code> a aussi
". \ Bin \ test" code> pour
argv [ 0] code>. P>
Il est censé être exactement comment l'utilisateur a invoqué le programme. I> Sauf si c'est une coquille de connexion, qui aura une tiret préparée.
La norme C (5.1.2.2.1P2) dit "Si la valeur de l'Argc est supérieure à zéro, la chaîne pointée par ARGV [0] représente le nom du programme i>"; Il est délibérément pas clair sur ce que le "nom du programme" est ou comment argv [0] "représente". POSIX dit essentiellement que argv [0] code> est tout ce qui a été transmis à la fonction
EXEC * () code> lorsque le programme a été invoqué - ce qui signifie qu'il apparaît à la coquille invoquant.
@ninjalj: Je ne le savais pas. C'est intéressant :)
@KeithThompson: D'accord, donc ce n'est pas un bug mingw. Bon à savoir.
Par défaut, la coquille avec jeu Pour appeler un programme avec une autre valeur, avec ZSH (Dunno avec d'autres coquilles) Utilisez: P> argv [0] code> est un paramètre comme des autres: il peut s'agir d'une chaîne d'octets terminée nul arbitraire. Il peut s'agir de la chaîne vide. Il est
argv [0] code> à tout ce qui est utilisé pour nommer le programme: a Nom Recherche dans
$ chemin code>, un relative ou un chemin absolu. Il peut s'agir d'un lien symbolique ou d'un fichier régulier. P>
ARGV0=whatever_you_want some_program arguments
Éventuellement associé: Stackoverflow.com/questions/2050961/... et Stackoverflow.com/Questtions/1528298/get-Path-of-executable
Je suis raisonnablement certain qu'il n'ya aucun moyen de garantir une telle chose. Si vous avez besoin d'une voie absolue vers l'exécutable, vous devez utiliser quelque chose d'autre que ARGV [0] pour l'obtenir.
Cela ne devrait pas fonctionner sous Windows non plus. Lancez-vous le programme de la ligne de commande ou de l'explorateur?
J'utilise un makefile. La commande Makefile est bin / test. Étrange, n'est-ce pas ...