先来一个简单的编译时动态链接的例子
创建文件function.h
#include <stdlib.h>
#define int_t int
int_t foo(int_t i, int_t j);
创建文件function.c
#include "function.h"
int_t foo(int_t i, int_t j)
{
if (i > j)
return i;
else
return j;
}
创建文件main.c
#include "function.h"
int_t foo(int_t i, int_t j)
{
if (i > j)
return i;
else
return j;
}
先编译生成动态链接库文件
gcc -shared -fPIC function.c -o function.so
-shared表示生成共享的目标文件,这种目标文件可以与其它相同标识(同为-fPIC或同为-fpic)的目标文件链接成可执行文件
-fPIC表示生成position-independent code(平台无关的代码)用于共享库。这种code在访问所有常量地址时,会通过系统的global offset table(GOT)。当程序开始运行时,动态加载器会去解析那个GOT。注,-fPIC比-fpic生成的代码要大,所以不用担心GOT大小超过限制的问题
最后将主程序与动态链接库链接
gcc -o main -L ./ main.c function.so
-L表示链接库的地址
注意运行时要把function.so放到/usr/lib之下
运行时动态链接的例子
编辑文件dltest.c
#include <stdlib.h>
#include <dlfcn.h>--------------------------------------------------------------void main()-
{-
int (*func)(int i, int j);-
void *dlhandle;-
char *dlError;-
printf("hello! I'm main.c\n");
dlhandle = dlopen("./function.so", RTLD_LAZY);-
if (dlhandle == NULL)
{
printf("dlhandle error\n");
}
dlError = dlerror();-
func = dlsym(dlhandle, "foo");-
printf("%i\n", func(10, 30));
dlclose(dlhandle);
}
同上文一样,生成function.so文件,只不过这个文件应该不用扔到/usr/lib中
链接文件
gcc -o dltest -ldl dltest.c
提一句选项-ldl的意思并不是说有一个gcc选项叫-ldl,而是-l dl的意思,把dl库链接过来,而这个dl库应该是包含了dlfcn.h等等文件吧。
分享到:
相关推荐
Linux下的可执行文件通常依赖于动态链接库(Dynamic Shared Library),这些库在程序运行时被加载,以节省内存空间和磁盘空间。通过`ldd`命令可以查看`hello`程序所依赖的动态链接库,如libc.so.6和ld-linux-x86-64....
### GNU GCC 开发教程知识点详解 #### 一、GCC简介 **GNU简介:** - **全称**: GNU Compiler Collection (GCC) - **起源**: 由Richard Matthew Stallman于1985年发起,旨在创建一套与Unix兼容的免费软件集合。 - *...
3. 在使用动态库的程序中,除了指定库路径(`-L`)和库名(`-l`),还需要确保运行环境能找到动态库,通常通过设置`LD_LIBRARY_PATH`环境变量或安装到系统默认的动态链接库路径。 4. 运行程序,如`./main`,如果...
本篇文章将深入探讨Linux环境下GCC的使用以及动态共享库的基础知识。 首先,GCC的工作流程可以分为预处理、编译、汇编和链接四个阶段。预处理阶段处理宏定义、条件编译指令和包含文件;编译阶段将源代码转换为汇编...
- 动态库(.so文件):在程序运行时被加载,磁盘上只需要一份库副本,节省空间,更新或修复库无需重新编译所有程序,但程序运行速度可能稍慢,因为需要在运行时进行动态链接。 3. 创建自己的库 创建动态库的步骤...
动态链接库是一种可执行文件格式,允许程序在运行时加载和使用库功能,而不是在编译时静态地将库代码合并到程序中。 Boost库的1.55.0版本可能包含了多个子库,这些子库涵盖了各种不同的用途,如线程管理、智能指针...
然后使用GCC链接动态库: ```bash gcc -o hello main.c -L. -lhellod ``` 运行结果如下: ``` printindynamicway:Hello World! ``` 需要注意的是,在不同的操作系统中,动态库的处理方式有所不同。例如,在...
动态链接库(libgmp-10.dll)在程序运行时被加载,减少了程序的存储需求,因为多个程序可以共享同一份库的内存映像。静态链接库(如libgmp.dll.a)则在编译时与代码合并,生成的可执行文件包含了库的所有功能,不...
在Windows环境下部署QT应用程序时,确保这些动态链接库文件存在于执行路径或系统路径下至关重要,因为它们包含了程序运行所必需的代码和数据。如果在没有这些库的情况下尝试运行QT应用程序,系统将无法找到必要的...
这两种方式各有优缺点:动态链接库可以减少应用程序的大小,但需要确保系统路径中有相应的.dll文件;静态链接库则避免了依赖问题,但可能导致最终程序体积增大。 在MinGW64环境下编译JsonCpp,首先需要安装MinGW64...
这里的“-l”前缀是GCC链接库时的标志,表示链接指定的库。 关于标签,“库”是指程序开发中复用的代码集合,通常以静态库(如libpthreadGC2.a)或动态库的形式存在。“线程”(Thread)是操作系统分配CPU时间的...
7. **高级主题**:探讨更复杂的用法,如动态链接、段对齐、共享对象等。 通过这些学习资源,你可以逐步掌握GNU链接脚本的精髓,不仅能够理解和编写链接脚本,还能灵活应用于实际的GPIO编程和其他嵌入式系统开发中。...
**链接库** GCC可以链接到外部库,如系统库或用户自定义库。使用 `-l` 选项指定库名,例如 `-lm` 用于链接数学库。库文件通常是`.a`(静态库)或`.so`(动态库)格式。 **预处理、编译、汇编和链接** GCC的工作...
本文将介绍如何使用GCC进行编译和链接,GDB的基本调试技巧,以及Linux下静态库和动态库的创建、使用和合并。 ### GCC的简单使用 **1. 创建可执行程序** - 编写源代码文件,例如`test.c`,包含主函数`main()`。 - ...
在软件开发中,静态库是预先编译并链接到目标代码中的库文件,与动态库不同,它们在运行时不需要单独的库文件。AR可以方便地管理这些静态库,添加、删除成员,并创建索引。 AS则是GNU的汇编器,它将高级语言(如C或...