2009-09-24 5 views
0

Je travaille dans un système embarqué (RTXC) où j'ai besoin de désactiver la fonctionnalité du débogueur qui est activée via une commande #define. Cependant, quand je change le #define en undefine, la compilation se passe bien, mais quand le linker s'exécute, il rencontre une erreur au sujet d'un symbole qui n'existe pas et qui appartient au code de débogage (qui aurait dû être pris en charge par la variable debugger étant défini). Est-il possible pour Make de s'assurer qu'une variable de préprocesseur n'est pas définie ou reste indéfinie?Peut-on annuler la définition d'une variable?

+0

s'il vous plaît modifier ces balises, "faire", "définir", "undef" ne sont pas bonnes étiquettes SO. –

+1

@Amr: Je suis d'accord sur define et under, mais make est un bon tag SO, puisqu'il fait référence à un outil spécifique. – Brian

Répondre

1

La réponse à votre question est non, Make ne peut absolument pas empêcher une variable d'être définie par, disons, une expression #define dans le code.

Vous semblez avoir un problème insaisissable. Cela pourrait être un bug dans vos Makefiles, une directive mal orthographiée, une mauvaise macro (si vous pardonnez la tautologie) ou quelque chose de trivial. Je suggère de brûler la forêt: découper tout jusqu'à ce que le problème s'arrête, puis voir où il se cachait. Si vous arrivez à HelloWorld et que le problème persiste, faites-le nous savoir.

0

Non. Vous devrez corriger le bogue dans votre code. Plus précisément, il y a quelque chose qui fait référence au côté de débogage des choses en dehors d'un #ifdef. Make ne pourra pas vous aider là-bas.

Une autre possibilité est que vous avez un .o ou quelque chose qui reste d'une construction précédente; vous pourriez vouloir essayer de nettoyer l'arbre de construction.

+0

Malheureusement, j'ai fait ces deux et le problème de liaison persiste encore. J'ai vérifié chaque utilisation de la variable et j'ai vérifié qu'ils sont tous inclus dans des blocs #ifdef, et je m'assure que chaque a, o, et ainsi construit par le projet est effacé du répertoire de construction (et/ou construit frais). Merci pour votre réponse néanmoins –

+2

@Alex Marshall: Est-ce que votre compilateur ne vous dit pas d'où provient la référence insatisfaite (premier emplacement, habituellement)? Avez-vous exécuté 'nm -g' sur les fichiers objets ou les bibliothèques pour les localiser? –

+0

@Jonathan Leffler: J'utilise un système d'exploitation embarqué, RTXC. Le compilateur m'indique que le problème provient d'une des librairies du noyau: librtxc.a. 'nm -g librtxc.a' m'indique que la référence est dans rtxcasm.o. Les bibliothèques sont recompilées à partir de zéro avec la variable CBUG étant indéfinie, mais en quelque sorte une référence à _isrcnt reste. J'ai vérifié toutes les références à isrcnt, et elles sont toutes correctement entourées de balises #ifdef CBUG, donc je ne vois pas pourquoi un symbole _isrcnt devrait être compilé dans le fichier objet rtxcasm.o. Incidentiellement, merci pour 'nm -g', je ne le savais pas –

Questions connexes