用gcc编译生成动态链接库*.so文件的方法
2006年11月03日 17:28
转载:
动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。
1、动态库的编译
下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。
so_test.h:
#include
#include
void test_a();
void test_b();
void test_c();
test_a.c:
#include "so_test.h"
void test_a()
{
printf("this is in test_a...\n");
}
test_b.c:
#include "so_test.h"
void test_b()
{
printf("this is in test_b...\n");
}
test_a.c:
#include "so_test.h"
void test_c()
{
printf("this is in test_c...\n");
}
将这几个文件编译成一个动态库:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
2、动态库的链接
在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。
test.c:
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
l 将test.c与动态库libtest.so链接生成执行文件test:
$ gcc test.c -L. -ltest -o test
l 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
$ ldd test
l 执行test,可以看到它是如何调用动态库中的函数的。
3、编译参数解析
最主要的是GCC命令行的一个选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
l -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
l -L.:表示要连接的库在当前目录中
l -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
l LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
l 当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
4、注意
调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。
转自:http://z8z88.blog.163.com/blog/static/112680088200992021047787/
分享到:
相关推荐
GCC 编译动态和静态链接库 GCC 编译动态和静态链接库是 Linux 应用开发中的一个重要组件,对于嵌入式 Linux 应用开发来说尤为重要。本文将详细介绍如何在 Linux 中创建静态库和动态库,以及使用它们。 静态库 ...
本资源提供的"libmupdf.so"是MuPDF的核心动态链接库,主要服务于Android平台,适用于开发者集成到自己的应用中,实现PDF文档的查看和处理功能。 在Android开发中,NDK(Native Development Kit)允许开发者使用C和...
### Linux 创建和使用动态链接库 .so 文件 在 Linux 系统中,动态链接库(Dynamic Link Library,简称 DLL)通常以 `.so` 文件的形式存在,即 Shared Object 文件。动态链接库可以被多个程序共享使用,有助于减少...
在C++编程中,动态链接库(.so文件)是一种重要的技术,允许代码在运行时被加载和使用,而不是在编译时静态链接。这使得应用程序可以更灵活地使用库,便于更新和优化,同时也降低了内存占用。以下将详细介绍如何使用...
本文将探讨如何在UNIX环境下,特别是Ubuntu系统中,使用GCC编译器创建和使用动态链接库。 首先,理解动态链接库(.so文件)的基本概念。在UNIX系统中,动态链接库是一种在程序运行时被加载到内存中的共享代码库。...
针对Android平台编译好的FFmpeg 3.4.5的动态链接库.so文件,包括armeabi-v7a arm64-v8a两个版本,包含头文件,包含x264,支持mediacodec硬解码h264,h265。可直接集成到工程中用于视频编辑、转码等。
我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的...
通过上述步骤,我们成功地使用GCC生成了静态库和动态库,并了解了它们的基本使用方法。静态库和动态库各有优缺点,选择哪种类型取决于具体的应用场景。在实际开发中,开发者可以根据项目的特定需求来决定使用哪一种...
首先,我们来看如何编译生成动态链接库。以一个简单的示例为例,假设我们有头文件`so_test.h`和三个C源文件`test_a.c`、`test_b.c`、`test_c.c`。`so_test.h`包含了三个函数声明:`test_a()`、`test_b()`和`test_c()...
在嵌入式开发领域,了解如何使用gcc工具链来构建和管理静态库(`.a`文件)与动态库(`.so`文件)是非常重要的。本文将详细介绍如何通过gcc创建这两种类型的库,并讨论它们各自的用途、优缺点以及在实际项目中的应用...
方法三:首先将main.c编译成对象文件main.o,接着使用gcc命令链接对象文件和静态库文件,生成可执行文件,如gcc -o hello main.o libmyhello.a。 接下来,我们探讨动态库(共享库)。与静态库不同,动态库在程序...
共享库又称为动态链接库,在程序运行时,库文件被映射到进程的地址空间并被动态链接。共享库的生成和使用过程如下: 2.1 生成目标文件(.o):与静态库不同,生成共享库的目标文件时必须添加编译选项“-fpic”,这样...
`ar`用于创建静态库,`gcc`的`-shared`选项用于生成动态库,`-Wl,-rpath=.`让链接器在当前目录查找动态库。 注意,`LDFLAGS`通常包含链接器的附加选项,如库搜索路径和链接器标志。`CFLAGS`则用于编译时的选项,...
在 Linux 中,可以使用 gcc 命令生成动态链接库。例如,要生成一个名为 libh.so 的动态链接库,需要先编译 h.c 文件生成目标文件 h.o,然后使用 gcc 命令将 h.o 文件链接到 libh.so 中。 gcc -c h.c -o h.o gcc -...
在这种情况下,静态编译OpenCV库(生成`.a`文件)成为了一个可行的解决方案。OpenCV是一个强大的计算机视觉库,它包含了大量的图像处理和计算机视觉算法,广泛应用于图像分析、机器学习和人工智能领域。下面我们将...
### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...
3. 在使用动态库的程序中,除了指定库路径(`-L`)和库名(`-l`),还需要确保运行环境能找到动态库,通常通过设置`LD_LIBRARY_PATH`环境变量或安装到系统默认的动态链接库路径。 4. 运行程序,如`./main`,如果...
- **Windows DLLs**:介绍Windows下的动态链接库。 - **Linux Libraries**:重点讲述Linux下的静态和动态库。 **10. 比较五种开源协议** - **GPL**:最严格的开源许可之一。 - **MIT**:宽松型许可。 - **BSD**:...
4. **编译与链接**:使用`bjam`工具进行编译,这个工具会根据之前的配置选项生成所需的库文件。命令可能类似`bjam --prefix=/usr/local --with-thread --with-system link=shared,static install`。这将编译动态库...