找不到头文件
解决方式 (头文件均为编译时刻使用)
1、把头文件路径写成绝对路径,把路径写全,如 (相对路径也行)
#include "/usr/include/stdio.h"
2、软链接到include默认路径下,或者直接拷贝
# 符号链接ln -s /usr/include/ffmpeg/libavcodec/ /usr/include/# 直接拷贝cp -r ffmpeg/* /usr/include/
注意,删除符号链接文件夹使用
# 无论是删除符号链接文件还是文件夹,都是直接rm,删除符号链接文件夹请勿加上 / 如 rm libavcodec/# 如果使用 rm -rf libavcodec/ 会导致源文件丢失,符号链接还在rm libavcodec
3、gcc 增加 -i(大写) 选项指定路径,可以有多个 -i
gcc -o a.out a.c -I /usr/include/
4、修改Makefile文件
有些gcc编译是在Makefile里的,方法同3,只是修改Makefile里的C_FLAG,具体情况具体分析,我只是举个例子
makefile指定头文件路径_玩转Makefile:企业项目Makefile实例_weixin_39607474的博客-CSDN博客
5、临时添加环境变量 (未实操) (.12.7 补充)
C和C++头文件
export C_INCLUDE_PATH=/opt/include:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=/opt/include:$CPLUS_INCLUDE_PATH
Environment Variables (The C Preprocessor)
记录
我是编译freerdp的时候发现报错
/root/freerdp/channels/drdynvc/tsmf/ffmpeg/tsmf_ffmpeg.c:26:32: 致命错误:libavcodec/avcodec.h:没有那个文件或目录#include <libavcodec/avcodec.h>
我安装了ffmpeg-devel 没效果
yum install ffmpeg-devel
原因是因为这个头文件库被放在/usr/include/ffmpeg/ ,而编译的代码写的头文件为 #include <libavcodec/avcodec.h> ,加上系统路径就是/usr/include/libavcodec/avcodec.h ,这肯定找不到啊,因为实际路径是/usr/include/ffmpeg/libavcodec/avcodec.h,于是就有了上面的办法
找不so库文件
解决方式
1、增加-L编译选项,-L可以加多个 (编译时刻)
默认路径一般在 /usr/lib /usr/lib64,把so文件拷贝到这里也行,或者软链接到这里,修改Makefile文件等,跟前面找不到头文件做差不多的事情
gcc -o a.out a.c -lpthread -L /usr/lib64
2、临时添加环境变量(编译时刻) (.12.7 补充)
从其他地方搜刮来的,未实操,可以参考
export LD_RUN_PATH=/usr/local/openssl-1.1.1/lib/
不确定能不能这么用
export LD_RUN_PATH=/opt/lib:$LD_RUN_PATH
3、添加到系统so库路径中 (运行时刻)
echo /usr/local/lib >> /etc/ld.so.confldconfig
4、临时添加环境变量(运行时刻)
export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
特殊情况下 (编译时刻)
比如 A 依赖 B,B 依赖 C
B在系统 /lib 路径下,而 C 不在系统路径下,这个时候可以使用LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/C/lib:$LD_LIBRARY_PATH
说明
编译时刻比如说so文件,要么 -L 指定路径,要么把文件拷贝到默认目录下,目前没有找到办法修改官方指定的编译路径,但是软件运行时刻的路径可以我们指定
编译时刻貌似也能指定路径(.12.7 补充)
核心思路
很多报错都是在configure里的,比如
configure: WARNING:--------------------------------------------Unable to find libssl--------------------------------------------
最好是直接写个简单的程序,如
gcc -o a.out a.c -lssl
看看能不能编译通过,有的configure不仅仅检查库文件,还检查头文件是否存在,另外,如果库文件存在的话最好 ldd 一下看下这个库下面的引用库是否存在
linux加载动态运行库失败_qq_38781075的博客-CSDN博客_linux 加载动态库失败
是不是存在not found
libssl.so.1.1 => not found
有就要解决
还有,有些configure是根据pkg判断的,如果你是手动编译的依赖,一定要把安装目录下的pc文件拷贝到 /usr/lib64/pkgconfig/
# 比如这样检测/usr/bin/pkg-config --exists --print-errors "openssl >= 0.9.8"# 记得拷贝pc文件cp /root/rpmbuild/BUILD/openssl-1.0.2u/*.pc /lib64/pkgconfig/ldconfig
如果有必要的话,pc文件的路径也最好检查下,里面有 include 和 lib 的路径,看看是否正确
cat /lib64/pkgconfig/freerdp.pcprefix=/usr/local/freerdpexec_prefix=/usr/local/freerdplibdir=/usr/local/freerdp/lib64includedir=/usr/local/freerdp/includeName: FreeRDPDescription: A free remote desktop protocol clientURL: /Version: 1.0.2Requires:Libs: -L${libdir} -lfreerdp-core -lfreerdp-codec -lfreerdp-gdi -lfreerdp-kbd -lfreerdp-rail -lfreerdp-channels -lfreerdp-utilsCflags: -I${includedir}
还有就是,如果你是 configure 文件编译,你可以留意一下里面是不是有类似LDFLAGS 之类的 flag 字段,我们手动加上库的路径,不过这个是具体情况具体分析了
export LDFLAGS="-L/usr/local/lib -L/usr/local/lib64"
此外
有些运行时找不到库也需要关注,有些库编译时,把原路径硬编码到so库里的,如果你的库是从其它地方(不同机器)拷贝过来的话,(并且拷贝过来的位置和原来不一样)也可能出问题,这种情况下,建议重新编译,编译目标路径选择同一个位置,再拷贝
freerdp_load_library_symbol: failed to open /lib64/freerdp/cliprdr.so
如果觉得《linux gcc 编译找不到头文件 找不到库》对你有帮助,请点赞、收藏,并留下你的观点哦!