编译库的 headers 无法相互访问
Compiled library's headers not being able to reach each other
我有一个关于名为 JSBSim 的库的问题。库本身并不是那么相关,但问题是围绕 header 文件中的多个循环依赖案例。
背景资料:
运行 CentOS 7 64 位 - 库与位于 usr/local/include 中的 header 以及 usr/local/lib[=17= 中相应的 .a 和 .la 静态链接]
/usr/local/include/JSBSim的目录结构如下:
initialization
input_output
math
models
simgear
FGFDMExec.h
FGJSBBase.h
我正在运行生成一个包含以下内容的 makefile:
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
错误不是来自 class 本身;而是包含库的主要 header 文件。我做了一些调查,文件 FGTrim.h 位于初始化中,在 FGTrim 的包含中:
#include "FGFDMExec.h"
看起来 FGTrim 看不到 FGFDMExec.h,因为它在目录下,但是 FGFDMExec.h 可以看到 FGTrim 就好了,因为在 FGFDMExec.h 中有以下内容:
#include "initialization/FGTrim.h"
有什么办法可以解决这个问题吗?如果不需要,我真的不想重新组织 header 结构或重写 header 并重新编译库。
谢谢!
我解决了这个问题。
我将 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
希望对大家有所帮助!
我有一个关于名为 JSBSim 的库的问题。库本身并不是那么相关,但问题是围绕 header 文件中的多个循环依赖案例。
背景资料:
运行 CentOS 7 64 位 - 库与位于 usr/local/include 中的 header 以及 usr/local/lib[=17= 中相应的 .a 和 .la 静态链接]
/usr/local/include/JSBSim的目录结构如下:
initialization
input_output
math
models
simgear
FGFDMExec.h
FGJSBBase.h
我正在运行生成一个包含以下内容的 makefile:
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
错误不是来自 class 本身;而是包含库的主要 header 文件。我做了一些调查,文件 FGTrim.h 位于初始化中,在 FGTrim 的包含中:
#include "FGFDMExec.h"
看起来 FGTrim 看不到 FGFDMExec.h,因为它在目录下,但是 FGFDMExec.h 可以看到 FGTrim 就好了,因为在 FGFDMExec.h 中有以下内容:
#include "initialization/FGTrim.h"
有什么办法可以解决这个问题吗?如果不需要,我真的不想重新组织 header 结构或重写 header 并重新编译库。
谢谢!
我解决了这个问题。
我将 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
希望对大家有所帮助!