linux编译链接找不到库文件的解决方法。

本文详细阐述了解决编译时遇到的ld错误,提示无法找到或打开xerces-c_static库文件。通过检查权限问题并修正文件权限,最终成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      今天编译出现ld: 0706-006 Cannot find or open library file: -l xerces-c_static,ld:open(): A file or directory in the path name does not exist.这个熟悉得不能再

熟悉的链接错误。

很简单,编译器打开xerces-c_static.a失败。出现这个错误的原因往往是因为目录库文件xerces-c_static.a没被编译出来或不存在。

      于是第一反应,看一下xerces-c_static.a文件有没有存在,发现文件是已经存在的。接着检查makefile,库目录也设置正确。反正clean编译了几次,问题依旧,突然想到,打开

文件失败,并不一定是不存在,也可能是用户权限不够。于是赶紧查看了一下,果然发现用户没有xerces-c_static.a文件的read权限。这个工程以外的库,之前我直接用root用户在

其它目录拷贝过来的,导致用户权限不足,在编译的时候,打不开相应的.a文件,修改了xerces-c_static.a文件后,问题解决。一个小小的复制运作,很有可能就是bug的关键,细节

决定成败,在coding中尤其重要。扯远了,把问题记录下来,希望可以给自己一个教训,也希望能帮助到其他人。

转载于:https://www.cnblogs.com/vathena/p/4108821.html

使用通俗易懂的语言举例并详细解释Shell进程之后的内容 预处理hello.c,主要是处理程序里面的文件包含、处理宏定义、条件编译。 把c文件编译成为汇编文件(.s),其中进行了词法分析,语法分析,语义分析、生成中间代码、对代码进行优化等工作。 把汇编文件(.s)编译成可重定位文件(.o)。 把可重定位文件(.o)链接成为可执行文件,其中链接可分为静态链接和动态链接 静态链接:在编译阶段就会把所有用到的库打包到自己的可执行程序中,其优点是具有较好的兼容性,不依赖外部环境,但是生成的程序比较大。 动态链接:在应用程序运行时,链接器去加载外部的共享库,并完成共享库和动态编译程序之间的链接。不同的程序可以共用代码库,节省内存空间。 控制台输入./hello命令后,Shell会创建一个新的进程来执行该程序。fork()函数就是用于创建一个新的进程的。这里的进程可以先简单理解为程序的容器。 exeve()函数可以理解为向上一步新建的进程,填充一个可执行程序(hello)。 sys_execve()函数为linux系统调用,被exeve()函数调用,这里的系统调用可以理解为是操作系统系统开放给用户的最底层接口。 do_exeve()函数是sys_execve()函数的核心。 load_elf_binary()函数会去文件系统中读取hello程序到内存,然后判断它是否是动态链接的可执行程序,如果不是,则进一步判断是否是静态链接的文件。 ld-linux-xx.so是glibc库中的动态连接器。如果hello程序是动态链接程序,该动态链接器会去加载共享库,并完成共享库和程序的链接工作, 然后准备真正开始执行hell程序。 相反,如果hello程序是静态编译的程序,则无需再加载链接共享库,直接开始准备执行hello程序。 第10和11步分别执行之后.都会开始执行hello程序,_start是程序的真正入口,而该符号在glibc中。也就是说程序的真正入口在glibc。 __libc_start_main()也是glibc中的函数,用于在执行用户程序前进行一些初始化工作。 调用用户程序中的mian()函数,开始执行printf打印函数。 程序执行完了之后,调用glibc库中的_exit()函数,来结束当前进程。
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值