关于名为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/

10-13 08:22