6
votes

Récupérer le nom de la cible de sortie en tant que chaîne au moment de la compilation en C ++

J'ai un projet qui compile dans plusieurs plates-formes ... Windows, UNIX, Linux, SCO, Nom Votre saveur.

Je voudrais tracer le nom de la cible de sortie dans une variable dans le code source de projet (nom du programme de sortie, DLL, ainsi que la bibliothèque ou autre) afin que je puisse l'utiliser dans des messages de manière générique pour référencer le composant Nom Soyez-lui un exe sous Windows, une DLL, une bibliothèque de la fois sur UNIX, etc.

Ce que je pense est une clé de préprocesseur comme la fonction _ mais quelque chose à tirer le nom de l'EXE / DLL sous Windows dans Visual C ++, puis de la bibliothèque de sortie SO dans GCC. Celles-ci vont probablement être deux mécanismes différents bien sûr, mais je crains de fusionner les deux dans une seule option que je peux utiliser génériquement dans mon code multiplateforme.

Donc donc une chose macro-oise ou quelque chose que je peux appeler, qui choisit au moins le nom du fichier de sortie Windows lors de la compilation (Visual C ++) afin que je puisse la pousser dans une chaîne constante dans le code et peut-être un moyen de faire le Même chose dans GCC, les deux plates-formes peuvent être enveloppées dans une seule abstraction. De préférence pas ramassé au runtime mais attrapé et persisté pendant la compilation.

Si la sortie est une bibliothèque, son nom de fichier LIB. Si c'est un composant, alors le nom du fichier de composant de sortie.

Je m'attends à ce que Boost ou Poco devait avoir quelque chose comme celui-ci peut-être déjà avec certains points d'extrémités non pris en charge qui vont bien.


0 commentaires

4 Réponses :


1
votes

Le compilateur ne peut pas le savoir. C'est le linker qui attribue un nom. Je dirais que votre meilleur pari est une définition ou la détermination du nom du module (qui ne fonctionnera pas pour les libs statiques)


0 commentaires

9
votes

Si tout est ensemble sous un seul projet, vous pouvez utiliser une macro de préprocesseur. Pour ce faire dans Visual Studio, ouvrez vos propriétés de projet et accédez à Propriétés de la configuration> C / C ++> Préprocesseur et ajoutez quelque chose comme Program_Name = "\" $ (projetName) \ "" code> au pré-processus Définit le champ (qui correspond à l'option / DFOO = BAR CODE> COMPILER).

Pour GCC, utilisez la valeur similaire -DFOO = BAR CODE> Option de ligne de commande. Par exemple, votre maquillage pourrait ressembler à quelque chose comme ceci: P>

PROGRAM_NAME = myapplication
CFLAGS += '-DEXECUTABLE_NAME="$(PROGRAM_NAME)"'

# Rule to make the executable from the object files
$(PROGRAM_NAME): $(OBJS)
    $(LD) $(OBJS) -o $@ $(LDFLAGS)

# Rule to make object files from C source files
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@


1 commentaires

Merci, j'avais oublié la syntaxe!



1
votes

Une autre solution, un bit hacky, serait de définir votre chaîne constante dans le code sur une valeur unique, facile à localiser et à une valeur suffisamment grande et après que la liaison soit effectuée, localisez et écrasez la valeur unique avec le nom réel du fichier que vous avez 're fonctionnement sur ...


0 commentaires

1
votes

Basé ma solution sur la réponse de @adam Rosenfield.

dans mon cmakelists.txt a créé une variable: xxx

a ajouté la macro au projet comme celui-ci: xxx

Je peux utiliser cette macro partout dans le projet Visual Studio généré.


0 commentaires