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、临时添加环境变量 (未实操) (2022.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 

我安装了 ffmpeg-devel 没效果

yum install ffmpeg-devel

原因是因为这个头文件库被放在 /usr/include/ffmpeg/ ,而编译的代码写的头文件为 #include ,加上系统路径就是 /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、临时添加环境变量 (编译时刻) (2022.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.conf
ldconfig

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 指定路径,要么把文件拷贝到默认目录下,目前没有找到办法修改官方指定的编译路径,但是软件运行时刻的路径可以我们指定

编译时刻貌似也能指定路径(2022.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.pc
prefix=/usr/local/freerdp
exec_prefix=/usr/local/freerdp
libdir=/usr/local/freerdp/lib64
includedir=/usr/local/freerdp/include

Name: FreeRDP
Description: A free remote desktop protocol client
URL: http://www.freerdp.com/
Version: 1.0.2
Requires:
Libs: -L${libdir} -lfreerdp-core -lfreerdp-codec -lfreerdp-gdi -lfreerdp-kbd -lfreerdp-rail -lfreerdp-channels -lfreerdp-utils
Cflags: -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,c语言,开发语言)