2009-04-07 11 views
1

Je n'ai aucun problème la compilation du code spécifique de la manière suivante:Howto incorporer -I makefile

g++ -I /opt/local/include Code1.cc -o Code1 

Cependant quand j'ai essayé de le faire dans le makefile:

CXX = g++ -Wall -Werror -gstabs -pedantic -O2 -g 

all: Code3 Code2 Code1 


Code3: Code3.cc Tools.cc 
    $(CXX) $^ -o [email protected] 

Code2: Code2.cc Tools.cc 
    $(CXX) $^ -o [email protected] 

Code1: Code1.cc Tools.cc 
    $(CXX) -I /opt/local/include $^ -o [email protected] 

Il se plaint. Quelle est la bonne façon de le faire? Notez que seul Code1.cc nécessite la bibliothèque externe comme incluse.

L'en-tête de Code1.cc ressemble à ceci:

#include <iostream>  
#include <vector>   
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <boost/math/distributions/chi_squared.hpp> 
using namespace std;  
using boost::math::chi_squared; 
using boost::math::quantile; 

L'erreur que je reçois est la suivante:

g++ -Wall -Werror -gstabs -pedantic -O2 -g -I/opt/local/include Code1.cc Tools.cc -o EstimateErrorMean 
In file included from /opt/local/include/boost/detail/lcast_precision.hpp:16, 
       from /opt/local/include/boost/lexical_cast.hpp:31, 
       from /opt/local/include/boost/math/special_functions/gamma.hpp:23, 
       from /opt/local/include/boost/math/distributions/chi_squared.hpp:13, 
       from EstimateErrorMean.cc:19: 
/opt/local/include/boost/integer_traits.hpp:164:66: error: use of C99 long long integer constant 
/opt/local/include/boost/integer_traits.hpp:164:77: error: use of C99 long long integer constant 
/opt/local/include/boost/integer_traits.hpp:170:70: error: use of C99 long long integer constant 

Répondre

4

-pedantic provoque des avertissements tous les points à rapporter, et -Werror provoque des avertissements à signaler les erreurs. Comme C++ ne définit pas la syntaxe de la constante d'entier long long "ULL" (C99), cela est probablement signalé puis promu à l'état d'erreur full-on par g ++.

Essayez de supprimer -pedantic.

+0

@rkb: suppression des travaux pédantes, mais pas #include neversaint

1

Il serait utile de savoir ce que la plainte est - mais essayez prenant l'espace entre le -I et /opt/local/include:

-I/opt/local/include $^ -o [email protected] 
+0

@ Dan: Je reçois toujours la même erreur après avoir supprimé l'espace. J'ai mis à jour OP avec un message d'erreur. – neversaint

+0

J'ai vu ça. Je pense qu'Eric Melski est sur la bonne voie, mais aussi essayer de sortir -pedantic - je pense * c'est * où est le problème. –

+0

Ou la suggestion de rkb: "Ou essayez #including " Cela devrait garder -pedantic heureux, au moins dans ce cas. –

1

Si vous utilisez GNU, vous pourriez envisager de faire une structure comme:

CXXFLAGS += -Wall -Werror -gstabs -pedantic -O2 -g 
CXXFLGAS += -I/opt/local/include 

SRCS:=Code1.cc Code2.cc Code3.cc 
OBJS:=$(subst .cc,.o,$(SRCS)) 
EXES:=$(subst .o,,$(OBJS)) 

all: $(EXES) 

où vous comptez sur le construit en règle pour gérer la compilation de fichiers à .cc.o fichiers aux exécutables.

Notez que vous pouvez également définir les drapeaux de l'éditeur de liens

LDFLAGS:=-g 

et similaires ...

5

Dans un GNU Make makefile, la convention est d'utiliser CXXFLAGS pour les drapeaux du compilateur C++, et Pour ajouter des indicateurs à une cible spécifique, vous pouvez utiliser des variables spécifiques à la cible. Par exemple:

CXX=g++ 

# Set CXXFLAGS to include the base set of flags 

CXXFLAGS=-Wall -Werror -gstabs -pedantic -O2 -g 

all: Code3 Code2 Code1 

Code3: Code3.cc Tools.cc 
     $(CXX) $(CXXFLAGS) $^ -o [email protected] 

Code2: Code2.cc Tools.cc 
     $(CXX) $(CXXFLAGS) $^ -o [email protected] 

# Add a target-specific addition to CXXFLAGS for Code1: 

Code1: CXXFLAGS += -I/opt/local/include 

Code1: Code1.cc Tools.cc 
     $(CXX) $(CXXFLAGS) $^ -o [email protected] 

Notez que vous pouvez également passer à l'aide de règles de motif, plutôt que de déclarer explicitement les règles pour toutes vos cibles (très similaires). Par exemple, vous pouvez remplacer les Code1, les règles Code2 et Code3 avec ceci:

%: %.cc Tools.cc 
     $(CXX) $(CXXFLAGS) $^ -o [email protected] 

EDIT: En réponse au poste mis à jour en ce qui concerne l'erreur spécifique vu: il semble que vous êtes probablement se brûler parce que vous incluez -Wall -Werror dans les drapeaux lorsque vous utilisez le Makefile, mais pas sur la ligne de commande. -Wall fait que g ++ est beaucoup plus pointilleux sur la syntaxe; -Werror amène g ++ à promouvoir des choses qui ne sont normalement que des avertissements dans des erreurs à part entière. Comme les erreurs sont signalées par rapport au code dans une bibliothèque tierce, vous pouvez peut-être vous débrouiller avec des options d'avertissement moins strictes (par exemple, supprimer -Wall); ou peut-être vous avez besoin de passer à une version plus récente du compilateur qui peut gérer les constructions sans se plaindre; ou peut-être vous avez juste besoin de spécifier explicitement -std=c99 pour alerter le compilateur que vous voulez le support C99.

Espoir qui aide,

Eric Melski

+0

@Erik: Je reçois toujours la même erreur. J'ai mis à jour le PO avec un message d'erreur. – neversaint

+0

@foolishbrat: voir ma réponse mise à jour. –

+0

Essayez de sortir -pedantic, aussi. De la page de manuel: "-pedantic ... rejeter tous les programmes qui utilisent des extensions interdites". –

1
INCLUDE_PATH = -I/opt/local/include 
LINK_PATH = -L <Library paths> 
LIBS = -l<libraryname> 

OBJECTS = Code1.o\ 
      Code2.o\ 
      Code3.o\ 

CXXFLAGS += $(INCLUDE_PATH) 

Code1 : $(OBJECTS) 
      $(CXX) $(LINK_PATH) [email protected] $(OBJECTS) $(LIBS) 

Cela pourrait fonctionner ...