2017-05-17 6 views
0

TL; DR: Lorsque je compile une bibliothèque externe avec un ensemble spécifique de drapeaux, comment puis-je gérer les avertissements déclenchés par les drapeaux utilisés pour compiler mon propre code lorsque j'inclus les en-têtes de cette bibliothèque? J'utilise autotools comme système de construction dans un projet et je voudrais régler correctement les drapeaux de compilation en fonction de la cible.Drapeaux de compilation spécifiques avec autotools et bibliothèque statique

Je voudrais compiler mes propres sources avec un niveau d'avertissement assez élevé (toute aide du compilateur pour déboguer/empêcher les bogues est toujours la bienvenue). Dans le jeu de drapeaux d'avertissement actuellement utilisé, il y a -Wsuggest-override que je prendrai comme exemple.

J'ai d'ailleurs mes sources d'une bibliothèque externe (pugixml si vous voulez vraiment savoir) que je voudrais compiler avec, disons que -Ofast

Pour avoir deux ensembles distincts de drapeaux, Dans la page d'information de automake il y a une section intéressante avec un exemple concret Per-Object Flags: How to simulate per-object flags?. (Il y a aussi des questions SO sur le sujet)

Voilà pourquoi dans mon Makefile.am il est le suivant:

__top_srcdir__bin_LDADD = libpugixml.a 
noinst_LIBRARIES = libpugixml.a 
libpugixml_a_SOURCES = pugixml/pugixml.cpp 
libpugixml_a_CPPFLAGS = -Ofast 

L'ensemble des sources de programme ne contient plus les sources de bibliothèque:

__top_srcdir__we_SOURCES = main.cc 

Cela fonctionne très bien, la bibliothèque est construite avec un ensemble de drapeaux, mes sources avec un autre, tout est ok ...

Jusqu'à ce que j'inclue un en-tête de la bibliothèque dans mes sources et c'est la raison pour laquelle je poste cette question

main.cc (trop longtemps?):

#include <pugixml/pugixml.hpp> // -Wsuggest-override triggered 

int main() { return 0; } 

Lors de la compilation, l'-Wsuggest-override est déclenchée dans les sources de la bibliothèque

Est-ce que la solution officielle automake pour avoir différents ensembles d'avertissements ne s'applique pas dans ce cas ou est-ce que je fais quelque chose de mal?

Je ne sais pas si ça compte, mais j'utilise g++ et/ou clang (selon l'humeur) la version automake: automake (GNU automake) 1,15

Merci pour votre aide

Répondre

1
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wsuggest-override" 
#include <pugixml/pugixml.hpp> 
#pragma clang diagnostic pop 

...

Est ce que je ferais d'habitude dans ces cas avec clang.

Je ne vois pas comment c'est un problème automake. Vous compilez la bibliothèque de commodité sans avertissements élevés et le code qui utilise l'en-tête de dépendance avec des avertissements élevés. Vous auriez le même problème si vous les avez construit en utilisant seulement make, ou cmake, ou la ligne de commande.

+0

+1, Merci pour votre réponse.Je me demandais s'il n'y avait pas un moyen de dire automake "cet en-tête appartient à cette bibliothèque donc si c'est inclus, utilisez les drapeaux appropriés" – Zermingore

+0

OK, je vois ce que vous obtenez à l'heure actuelle. Malheureusement, la réponse est non, "automake" ne peut pas faire ça. – ldav1s