2017-08-07 1 views
0

Je suis en train de compiler le code source deux fois avec un MACRO défini & non défini. Ainsi, par défaut, la macro est pas défini & je veux définir cette macro par des arguments de Makefile, commecomment une définition de macro est passée de Makefile à un fichier d'en-tête?

$(MAKE) -c $(present_dir)/new_dir -DONE_MACRO=1 

donc je me sers de ce ONE_MACRO dans file.h. comment cette définition est reflétée et sait au préprocesseur. Ici, j'utilise cygmake. Comment passer un MACRO as argument to compiler avec l'outil cygmake.

fichier.h: -

#if ONE_MACRO 
    #define some_targets 
#else 
#define other_targets 
#endif 

Alors, comment cette ONE_MACRO est défini à partir du fichier make, im essayant de passer macro comme argument comme ci-dessous

Makefile: -

MY_TARGET: 
    $(MAKE) -C $(present_dir)/target_dir -D ONE_MACRO=1 $(MAKECMDGOALS) 
+1

Votre question n'est pas claire. [This] (http://www.cplusplus.com/doc/tutorial/preprocessor/) montre comment utiliser '# ifdef' dans' file.h'. Est-ce que ça répond à votre question? – Beta

+0

On ne sait pas ce que vous demandez. Le compilateur traite l'argument '-D MACRO_DEFINE = 1' (écrit classiquement sans l'espace entre la lettre d'option' D' et la valeur 'MACRO_DEFINE = 1') comme s'il y avait une ligne de code qui lisait' #define MACRO_DEFINE 1' . Ceci est défini avant que tout le code réel est traité. C'est simple, alors ce n'est probablement pas ce que vous demandez, mais ce que vous demandez n'est pas clair. –

+0

Je veux passer une ** macro au compilateur de Makefile comme un argument **, cette macro utilise dans 'file.h'.so pendant la compilation je vais compiler le' file.h' ** deux fois basé sur la macro comme défini et indéfini **. Je pense que c'est clair maintenant. – Kumar2080

Répondre

1

Pour chaque compilateur contient une variable d'environnement qui transmet les arguments au compilateur/éditeur de liens. tout en traitant avec autre que GCC nous devons trouver ces variables environnementales avant l'utilisation.

comme dans mon cas RVCT31_CCOPT est la variable qui transmet les arguments au compilateur lors de la construction.

0

Voici un exemple de comment faire ce que je pense que vous voulez:

define_test.c:

#include <stdio.h> 

#ifndef X 
#define X 1 
#endif 

int 
main() 
{ 
    printf("X = %d\n", X); 
} 

Makefile:

X = 1 
CPPFLAGS += -DX=$(X) 

define_test: FORCE 
     $(CC) $(CPPFLAGS) define_test.c -o [email protected] 

FORCE: 

ensuite de passer une valeur différente pour macro X:

make X=2 

(Cela suppose que vous voulez que la valeur de la macro à un nombre entier; si vous voulez que la valeur soit une chaîne, vous devez obtenir un peu plus difficile de citer correctement)

Vous pouvez également ajouter la définition directement au CPPFLAGS, par exemple:.

make CPPFLAGS+=-DX=2

+0

J'ai essayé ce concept, mais le cygmake me donne l'option invalide 'cygmake: option invalide - D'. – Kumar2080

+0

Bien sûr, '-D' est une option invalide à faire; c'est une option pour le précompilateur. Vous dites que vous avez "essayé le concept", mais qu'est-ce que ** exactement ** avez-vous tapé? Avez-vous tapé, par exemple, 'make CPPFLAGS + = - DONE_MACRO = 1'? – varro

+0

oui, j'ai ajouté la macro avec -D à CPPFLAGS. ici le compilateur et ses arguments sont donnés à travers le fichier de configuration des blocs de code .cbp. Main Makefile appelle les fichiers makefile du sous-dossier là-bas ce fichier cbp est exécuté et compile le code. – Kumar2080