编译的库的标题无法相互访问

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),我会感到惊讶。如果你真的需要所有这些,那么这个包的头文件格式错误。

以上是关于编译的库的标题无法相互访问的主要内容,如果未能解决你的问题,请参考以下文章

webpack-dev-server 正确监视和编译文件,但浏览器无法访问它们

使库的方法对外部访问不可见,但对库可见

如何编译使用从不同编译器编译的库的应用程序?

NSBundle 无法访问静态库 java 脚本文件路径

无法从主项目访问变量?

安装 DESEq2 错误:无法访问存储库的索引 https://bioconductor.org