失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > linux gcc 编译找不到头文件 找不到库

linux gcc 编译找不到头文件 找不到库

时间:2020-04-24 15:10:00

相关推荐

linux gcc 编译找不到头文件 找不到库

找不到头文件

解决方式 (头文件均为编译时刻使用)

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 编译找不到头文件 找不到库》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。