当你在编译代码时,你通常要处理多个源文件。开发人员倾向于将不同的类或模块放在不同的文件中,这样它们可以被单独维护,甚至可能被不同的项目使用。但当你编译这些文件时,许多文件会被编译成一个可执行文件。
为桦南等地区用户提供了全套网页设计制作服务,及桦南网站建设行业解决方案。主营业务为成都做网站、成都网站设计、成都外贸网站建设、桦南网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
这通常是通过创建共享库来完成的,然后从可执行文件中动态链接回它们。这样可以通过保持模块化功能的外部性来保持可执行文件的小型化,并确保库可以独立于使用它们的应用而被更新。
当你 用 GCC 编译 时,你通常需要在你的工作站上安装一个库,以便 GCC 能够定位到它。默认情况下,GCC 假定库在系统库路径中,例如 /lib64 和 /usr/lib64。然而,如果你要链接到一个你自己的尚未安装的库,或者你需要链接到一个没有安装在标准位置的库,那么你必须帮助 GCC 找到这些文件。
有两个选项对于在 GCC 中寻找库很重要:
例如,假设你写了一个叫做 libexample.so 的库,并且你想在编译你的应用 demo.c 时使用它。首先,从 demo.c 创建一个对象文件:
$ gcc -I ./include -c src/demo.c
-I 选项在 GCC 搜索头文件的路径中增加了一个目录。在这个例子中,我假设自定义头文件在一个名为 include 的本地目录中。-c 选项防止 GCC 运行链接器,因为这个任务只是为了创建一个对象文件。结果如下:
$ ls
demo.o include/ lib/ src/
现在你可以使用 -L 选项为你的库设置一个路径,然后进行编译:
$ gcc -L`pwd`/lib -o myDemo demo.o -lexample
注意,-L 选项在 -l 选项之前。这很重要,因为如果在你告诉 GCC 查找非默认库之前没有将 -L 添加到 GCC 的搜索路径中,GCC 就不知道要在你的自定义位置上搜索。编译成功了,但当你试图运行它时,却出现了问题:
$ ./myDemo
./myDemo: error while loading shared libraries:
libexample.so: cannot open shared object file:
No such file or directory
ldd 工具可以打印出共享对象的依赖关系,它在排除类似问题时很有用:
$ ldd ./myDemo
linux-vdso.so.1 (0x00007ffe151df000)
libexample.so => not found
libc.so.6 => /lib64/libc.so.6 (0x00007f514b60a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f514b839000)
你已经知道定位不到 libexample,但 ldd 输出至少确认了它对工作库的期望位置。例如,libc.so.6已经被定位,ldd 显示其完整路径。
LD_LIBRARY_PATH 环境变量 定义了库的路径。如果你正在运行一个依赖于没有安装到标准目录的库的应用程,你可以使用 LD_LIBRARY_PATH 添加到系统的库搜索路径。
有几种设置环境变量的方法,但最灵活的是在运行命令前放置环境变量。看看设置 LD_LIBRARY_PATH 对 ldd 命令在分析一个“损坏”的可执行文件时的作用:
$ LD_LIBRARY_PATH=`pwd`/lib ldd ./
linux-vdso.so.1 (0x00007ffe515bb000)
libexample.so => /tmp/Demo/lib/libexample.so (0x0000...
libc.so.6 => /lib64/libc.so.6 (0x00007eff037ee000)
/lib64/ld-linux-x86-64.so.2 (0x00007eff03a22000)
这也同样适用于你的自定义命令:
$ LD_LIBRARY_PATH=`pwd`/lib myDemo
hello world!
然而,如果你移动库文件或可执行文件,它又会失效:
$ mv lib/libexample.so ~/.local/lib64
$ LD_LIBRARY_PATH=`pwd`/lib myDemo
./myDemo: error while loading shared libraries...
要修复它,你必须调整 LD_LIBRARY_PATH 以匹配库的新位置:
$ LD_LIBRARY_PATH=~/.local/lib64 myDemo
hello world!
在大多数情况下,LD_LIBRARY_PATH 不是你需要设置的变量。按照设计,库安装到 /usr/lib64 中,因此应用自然会在其中搜索所需的库。在两种情况下,你可能需要使用 LD_LIBRARY_PATH:
编译软件为你在运行系统方面提供了很大的灵活性。LD_LIBRARY_PATH 变量以及 -L 和 -l GCC 选项是这种灵活性的组成部分。
新闻标题:编译代码时动态地链接库
标题网址:http://www.gawzjz.com/qtweb/news11/202511.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联