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

本文介绍了在编译过程中遇到找不到头文件和动态库问题的解决方案,包括修改头文件路径为绝对路径、软链接、修改Makefile、设置环境变量以及调整编译选项。同时,对于运行时找不到库文件,文章提到了添加-L选项、修改LD_LIBRARY_PATH、将库添加到系统路径以及检查configure配置。最后,强调了检查和配置pkgconfig文件以及关注动态库的依赖关系的重要性。
摘要由CSDN通过智能技术生成

找不到头文件

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

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)

6、头文件 define 引入的问题

为了解决头文件重复包含,而使用了 define

#ifndef BASE_TYPE_H
#define BASE_TYPE_H


#endif

有时候我们可能会从其他代码(当前工程内)里拷贝头文件代码,但忘记改这个 define,就有可能你的两个头文件都用了同一个 define,结果只生效了一个头文件,导致引入了头文件也无法使用里面定义的类

记录

我是编译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、临时添加环境变量 (编译时刻) (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

### 回答1: 这个问题通常是由于没有将头文件的路径添加到编译器的搜索路径中造成的。 解决方法有两种: 1.使用 -I 选项将头文件目录添加到编译器的搜索路径中。例如:gcc -I /usr/include/mylib myprogram.c -o myprogram 2.在系统的环境变量中配置头文件目录,例如在Linux中,可以在/etc/ld.so.conf 中添加头文件目录,然后运行ldconfig。 ### 回答2: Linux是一种广泛使用的操作系统,由于其开放源代码和免费使用的特点,被越来越多的开发者和用户所使用。而在开发Linux应用程序时,有时会遇到不到头文件的问题。以下将从原因和解决方案两个方面进行分析。 1. 原因 在使用Linux平台编译C/C++程序时,需要引用系统头文件。这些头文件一般位于/usr/include或者/usr/local/include目录下。如果编译不到这些头文件,就会出现不到头文件的错误。常见的原因如下: (1)头文件路径不正确:在编写代码时没有将系统头文件路径添加到编译器的参数中。 (2)缺少相关依赖:有些头文件是依赖于相关的文件的,如果没有该文件,头文件就会无法正常引用,从而导致不到头文件的错误。 (3)权限问题:有些头文件可能需要root权限才能操作,如果当前用户没有权限,就会出现不到头文件的问题。 2. 解决方案 (1)检查头文件路径:通常情况下,可以将系统头文件路径添加到编译器的参数中,例如: gcc -I /usr/include hello.c 如果头文件在其他路径下,需要将路径加入-I参数中。 (2)安装依赖:如果头文件引用了相关的文件,可以通过安装该文件来解决问题。例如,如果需要使用sqlite3, 可以使用如下命令安装: sudo apt-get install libsqlite3-dev (3)更改权限:如果出现权限问题,可以使用chmod命令更改文件权限。例如: chmod 644 /usr/include/stdio.h 以上就是针对Linux编译不到头文件的原因和解决办法的介绍。在开发过程中,遇到问题需要认真排查并掌握解决方法,以提高开发效率和代码质量。 ### 回答3: 在Linux编译过程中经常会遇到不到头文件的问题,这通常是由于编译环境没有正确配置所引起的。下面我将介绍三种可能性和对应的解决方法。 1. 头文件不在标准路径中 在Linux中,头文件通常保存在/usr/include目录下或者在用户自定义的路径中,如果编译不到头文件,可能是因为头文件路径没有正确配置。 解决方法: 可以尝试将头文件拷贝到标准路径中,或者使用-I选项指定头文件路径,例如: gcc -I/path/to/header file.c -o file 2. 缺少相关开发 有些头文件需要使用对应的开发才能编译,如果没有正确安装相应的开发,就会不到头文件。 解决方法: 可以通过包管理器安装缺少的开发,例如: sudo apt-get install lib<library>-dev 其中<library>为对应的开发名称。 3. 文件名大小写不一致 在Linux中,文件名大小写是敏感的,如果头文件名与实际文件名大小写不一致,就会不到头文件。 解决方法: 可以检查头文件名和实际文件名是否大小写一致,如果不一致,可以修改文件名或者修改包含路径中的大小写。例如: #include "Header.h" // 头文件名为Header.h,实际文件名为header.h 修改为: #include "header.h" 总之,在编译不到头文件通常是由于配置不正确或者文件问题引起的,针对不同的情况,可以采取不同的解决方法。在编译时遇到问题不要慌张,耐心地排查问题,一定能成功编译出代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值