2016-11-17 5 views
0

Je rencontre un problème concernant la bibliothèque appelée JSBSim. La bibliothèque elle-même n'est pas si pertinente, mais les problèmes entourent plusieurs cas de dépendance cyclique dans les fichiers d'en-tête.Les en-têtes de la bibliothèque compilée ne peuvent pas se rejoindre

Contexte info:

Exécution CentOS 7 64 bits - bibliothèques sont liées statiquement avec en-têtes situés dans usr/local/include et correspondant .a et .la dans usr/local/lib

La structure du répertoire pour/usr/local/include/JSBSim est comme suit:

initialization 
input_output 
math 
models 
simgear 
FGFDMExec.h 
FGJSBBase.h 

Je suis en un Makefile avec le contenu suivant:

all: 
    g++ *.cpp -lJSBSim -o output 

clean: 
    /bin/rm -f output 

J'écris une enveloppe pour le JSBSim avec le squelette de base suivant:

#include <JSBSim/FGFDMExec.h> 

class JsbSimWrapper 
{ 
}; 

-je obtenir l'erreur suivante lorsque je lance le makefile:

compilation terminated. 
In file included from /usr/local/include/JSBSim/FGFDMExec.h:47:0, 
       from JsbSimWrapper.hpp:7, 
       from main.cpp:1: 
/usr/local/include/JSBSim/initialization/FGTrim.h:53:23: fatal error: FGFDMExec.h: No such file or directory 
#include "FGFDMExec.h" 
        ^
compilation terminated. 
make: *** [all] Error 1 

Les erreurs ne viennent pas de la classe elle-même; plutôt l'inclusion du fichier d'en-tête principal de la bibliothèque. Je l'ai fait quelques recherches, et le fichier FGTrim.h est situé dans l'initialisation, et FGTrim de comprendre: de

#include "FGFDMExec.h" 

Il semble que FGTrim ne peut pas voir FGFDMExec.h parce qu'il est un répertoire vers le bas, mais FGFDMExec.h peux voir FGTrim très bien parce que FGFDMExec.h les éléments suivants sont les suivantes:

#include "initialization/FGTrim.h" 

est-il un moyen de contourner ce problème? Je ne veux vraiment pas avoir à réorganiser la structure d'en-tête ou réécrire les en-têtes et recompiler la bibliothèque si je n'ai pas à le faire.

Merci!

+0

Ajoutez '-I/usr/local/include/JSBSim/initialization' à' CXXFLAGS' dans votre fichier makefile. –

+0

^Pour votre appel de compilateur respectivement. –

+0

Je viens d'essayer, malheureusement sans succès. – Peter

Répondre

0

J'ai résolu le problème.

J'ai effectué mon makefile à ce qui suit:

JSBSIM=/usr/local/include/JSBSim 
CXXFLAGS=-I$(JSBSIM) 
CXXFLAGS+=-I$(JSBSIM)/initialization 
CXXFLAGS+=-I$(JSBSIM)/simgear/xml 
CXXFLAGS+=-I$(JSBSIM)/simgear 
CXXFLAGS+=-I$(JSBSIM)/models/atmosphere 
CXXFLAGS+=-I$(JSBSIM)/models/propulsion 
CXXFLAGS+=-I$(JSBSIM)/models/flight_control 
CXXFLAGS+=-I$(JSBSIM)/models 
CXXFLAGS+=-I$(JSBSIM)/input_output 
CXXFLAGS+=-I$(JSBSIM)/math 

output: main.cpp JsbSimWrapper.cpp 
    g++ main.cpp JsbSimWrapper.cpp $(CXXFLAGS) -lJSBSim -o output 
clean: 
    /bin/rm -f output 

Espérons que quelqu'un aide!

+0

Je serais surpris si vous aviez vraiment besoin de quelque chose d'autre que la première ligne ici '-I $ (JSBSIM)'. Si vous avez vraiment besoin de tout cela, alors les fichiers d'en-tête pour ce paquet sont malformés. – MadScientist