先来一个简单的编译时动态链接的例子
创建文件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等等文件吧。
分享到:
相关推荐
- **-fPIC 编译选项**:生成位置无关代码,适用于动态链接库。 - **-static 编译选项**:链接静态库而不是动态库,使得二进制文件完全自包含。 #### 6. AT&T的汇编格式 AT&T汇编格式与Intel汇编格式不同,主要区别...
动态链接库是一种包含了一个或多个程序可以使用的函数或数据的文件。它可以在程序运行时被加载,而不是在编译时就被包含进去。这种方式使得多个程序可以共享相同的代码,减少了系统的内存消耗,并允许在不重新编译...
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! ``` 需要注意的是,在不同的操作系统中,动态库的处理方式有所不同。例如,在...
本文将详细介绍如何使用gcc在Linux环境下生成静态库和动态库,以及它们的使用方法。 首先,让我们来探讨静态库。静态库(也称归档库),在程序编译阶段被链接到目标代码中。一旦链接完成,程序运行时不再需要静态库...
动态链接库(libgmp-10.dll)在程序运行时被加载,减少了程序的存储需求,因为多个程序可以共享同一份库的内存映像。静态链接库(如libgmp.dll.a)则在编译时与代码合并,生成的可执行文件包含了库的所有功能,不...
在Windows环境下部署QT应用程序时,确保这些动态链接库文件存在于执行路径或系统路径下至关重要,因为它们包含了程序运行所必需的代码和数据。如果在没有这些库的情况下尝试运行QT应用程序,系统将无法找到必要的...
这两种方式各有优缺点:动态链接库可以减少应用程序的大小,但需要确保系统路径中有相应的.dll文件;静态链接库则避免了依赖问题,但可能导致最终程序体积增大。 在MinGW64环境下编译JsonCpp,首先需要安装MinGW64...
介绍了如何在AVR单片机上实现对其他类型单片机的编程,如AT89S52,这涉及到硬件接口的设计和下位机程序的编写,展示了GCC在复杂项目中的应用能力。 #### 7. 硬件TWI端口编程 TWI(Two-Wire Interface)是一种双向...
这里的“-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或...