编译的库的标题无法相互访问
Posted
技术标签:
【中文标题】编译的库的标题无法相互访问【英文标题】:Compiled library's headers not being able to reach each other 【发布时间】:2016-11-17 16:59:47 【问题描述】:我遇到了关于名为 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
错误不是来自类本身;而是包含库的主头文件。我做了一些调查,文件 FGTrim.h 位于初始化中,并且在 FGTrim 的包含中:
#include "FGFDMExec.h"
看起来 FGTrim 看不到 FGFDMExec.h,因为它在一个目录下,但 FGFDMExec.h 可以看到 FGTrim 就好了,因为在 FGFDMExec.h 中包含以下内容:
#include "initialization/FGTrim.h"
有没有办法解决这个问题?如果不需要的话,我真的不想重新组织头文件结构或重写头文件并重新编译库。
谢谢!
【问题讨论】:
将-I/usr/local/include/JSBSim/initialization
添加到您的makefile 中的CXXFLAGS
。
^ 分别到你的编译器调用。
我刚试过,可惜没有成功。
您需要在编译行中添加-I/usr/local/bin/JSBSim
(注意末尾没有initialization
)。
【参考方案1】:
我解决了这个问题。
我将我的 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
希望对某人有所帮助!
【讨论】:
如果你真的需要除了第一行之外的任何东西-I$(JSBSIM)
,我会感到惊讶。如果你真的需要所有这些,那么这个包的头文件格式错误。以上是关于编译的库的标题无法相互访问的主要内容,如果未能解决你的问题,请参考以下文章