关于名为JSBSim的库,我有一个问题。库本身并不那么相关,但问题是头文件中的多个循环依赖情况。
背景信息:
运行CentOS 7 64位库与usr/local/include中的头以及usr/local/lib中相应的.a和.la静态链接
/usr/local/include/JSBSim的目录结构如下:
initialization
input_output
math
models
simgear
FGFDMExec.h
FGJSBBase.h
我正在运行包含以下内容的生成文件:
all:
g++ *.cpp -lJSBSim -o output
clean:
/bin/rm -f output
我正在为JSBSim编写一个包装器,其基本框架如下:
#include <JSBSim/FGFDMExec.h>
class JsbSimWrapper
{
};
运行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
错误不是来自类本身,而是包含库的主头文件。我做了一些调查,文件fgdrim.h位于initialization中,fgdrim的include中:
#include "FGFDMExec.h"
看起来fgdrim无法看到FGFDMExec.h,因为它位于目录下,但是FGFDMExec.h可以很好地看到fgdrim,因为在FGFDMExec.h中有以下内容:
#include "initialization/FGTrim.h"
有什么办法绕过这个吗?如果不需要,我真的不想重新组织头结构或重写头并重新编译库。
谢谢!
最佳答案
我解决了这个问题。
我将makefile编辑为:
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
希望能帮上忙!
关于c++ - 编译库的 header 无法相互访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40660821/