我在交差编译的时候经常碰到类似这样的问题:
xxx.c:4: fatal error: xxx.h: No such file or directory
注:这里的xxx是一个一般的表述。
这个博客点击量挺高的,但是内容过于简单,更新下(没有验证,抛砖引玉吧),方才对得起你的时间~
方法一:修改源码
通常很多头文件会到xxx/usr/include/或者xxx/include目录下去找头文件,但是有些头文件在某个include/abc子目录下,而编译器不知道去abc目录下去找,所以此时需要指定头文件的路径,或者修改源码,类似:
#include <abc/xxx.h>
或者:
#include "abc/xxx.h"
方法二:指定路径
如果是第三方开源项目修改源码有些麻烦,此时就需要为编译器指定头文件查找路径
使用gcc/g++编译解决方法
在gcc/g++中指定头文件路径,使用-I选项,比如:
gcc test.c -o test -I xxx/include/abc -L ...
在Makefile文件中
在Makefile文件中:
INC_DIRS := -I ./inc ../common/inc ../common/inc/mod ../common/inc/tlsdk ../encode/inc
INC_DIRS += $(TL_APP_MPP_PATH)/include
#引用时
$(CC) $(INC_DIRS) -o $@ ...
再有就是所说的文件xxx.h不存在或者目录,可是我看见xxx.h这个文件确实是在这个目录下的,我“认真”分析,弄了好久,没道理,为什么makefile文件中指定的头文件目录路径却还是找不到这个文件呢?结果我找高手一看,发现xxx.h文件在指定的头文件目录里是Xxx.h的,我恍然大悟,原来是多了一个大写字母。就是自己没有认真比对。第二次又碰到这个问题,我比较了这两个文件结果我发现所需要的文件名和头文件目录下的文件名是一样的。我就纳闷了。我还是看了好久,找不到原因,我请高手过来一看,原来是目录名中多了一个大写字母。
在Makefile.am文件中
AM_CFLAGS = \
... \
-I../inc \
-I$(topdir)/dsutils/inc \
-I xxx/include/abc
或者:
AM_CPPFLAGS = \
... \
-I../inc \
-I$(topdir)/dsutils/inc \
-I xxx/include/abc
在CMakefile.txt中
举个例子:
include_directories (
${PROJECT_SOURCE_DIR}
${CMAKE_BINARY_DIR}
)
或者:
target_include_directories(xxx INTERFACE
$<INSTALL_INTERFACE:include/>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>
PRIVATE ${XXX_INCLUDE_DIRS}
)