`
hwy584624785
  • 浏览: 47072 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

linux c 编译和使用库文件

 
阅读更多

问:我源文件为main.c, x.c, y.c, z.c,头文件为x.h,y.h,z.h
如何编译成.so动态库?
编译器用gcc
最好能给出详细参数解释,谢谢
答:
# 声称动代连接库,假设名称为libtest.so
gcc x.c y.c z.c -fPIC -shared -o libtest.so

# 将main.c和动态连接库进行连接生成可执行文件
gcc main.c -L. -ltest -o main
# 输出LD_LIBRARY_PATH环境变量,一边动态库装载器能够找到需要的动态库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
# 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
ldd main
# 执行就不用说了吧 
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用
/sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
举例:
动态链接库*.so的编译与使用- -
动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。
1、动态库的编译
下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。
so_test.h:
#include <stdio.h>
#include <stdlib.h>
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_c.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
         执行test,可以看到它是如何调用动态库中的函数的。
3、编译参数解析
最主要的是GCC命令行的一个选项:
          -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
         -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
         -L.:表示要连接的库在当前目录中
         -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
         LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
         当然如果有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文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

分享到:
评论

相关推荐

    linux下编译.so库文件

    综上所述,Linux下的库文件编译是一个既复杂又灵活的过程,涵盖了静态库和动态库的创建及使用。掌握这些知识不仅能够帮助开发者构建更高效、更易于维护的软件,还能在遇到具体问题时,提供解决问题的新思路和方法。...

    grpc-1.30.2 Linux 编译静动态库

    默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...

    LINUX下简单的编译和使用动态链接库

    LINUX 下简单的编译和使用动态链接库 在 LINUX 下,编译和使用动态链接库是一项非常重要的技术。动态链接库,即 Shared Object(.so 文件),是将一些常用的代码,例如函数、类等,编译成一个独立的文件,供其他...

    LINUX下多个c程序编译链接的程序

    在Linux环境中,掌握`gcc`编译器和`makefile`的使用对于高效开发多文件C程序至关重要。这不仅简化了编译流程,而且便于团队协作和项目维护。通过理解这些基本概念,开发者可以更好地管理和优化他们的代码。

    Linux编译动态库和静态库

    总结,动态库和静态库在Linux下的编译和使用涉及的关键点包括`-fpic`、`-shared`、`-L`、`-l`、`ar`工具以及正确的文件命名规则。理解这些概念和操作对于Linux系统下的C/C++编程至关重要,能够帮助开发者更有效地...

    Cython文件在window与linux下的编译指导

    在 Linux 平台上,需要使用 GCC 软件将 C 代码文件编译成.so 库。 6. 在 Windows 和 Linux 平台上的差异 在 Windows 和 Linux 平台上,编译 Cython 文件的步骤和使用的软件不同。在 Windows 平台上,需要安装 MinGW...

    linux环境中c++调用lua动态链接库以及编译方法

    总结来说,C++在Linux中调用Lua动态链接库涉及到Lua库的编译、链接以及在C++代码中的使用。理解这些步骤对于开发涉及C++和Lua混合编程的应用至关重要。正确配置和使用动态链接库,可以让C++充分利用Lua的脚本能力,...

    Linux内核编译步骤

    编写模块文件,例如 hello.c,包含了模块的初始化和退出函数。使用 Makefile 文件来编译模块文件,生成可加载的模块文件。 Linux 内核编译的重要概念 * Linux 内核树: Linux 内核的源代码树,包含了内核的所有源...

    libpqxx-4.0.1源码和编译之后的库文件.rar

    在本文中,我们将深入探讨libpqxx-4.0.1版本的源码、编译过程以及生成的库文件,以便更好地理解其工作原理和应用。 首先,libpqxx是基于libpq,PostgreSQL官方提供的C语言接口,进行封装的。libpq提供了一系列的...

    Linux环境下编译的TensorFlow C++ API动态库文件.7z

    1、TensorFlow C++ API的编译是线上使用TensorFlow C++ API调用预先训练好的模型完成预测项目的必经之路...2、Linux环境下编译TensorFlow C++ API生成的动态链接库:libtensorflow_cc.so,libtensorflow_framework.so。

    librtmp库实测可在Linux下进行交叉编译

    交叉编译的关键在于配置正确的编译工具链,包括编译器、链接器等,这些工具链应指向目标架构的系统头文件和库。 **交叉编译步骤** 1. **安装交叉编译工具链**:获取针对目标架构的GCC编译器和其他相关工具。 2. **...

    Linux下编译ffmpeg的wasm库

    在Linux环境下编译FFmpeg的WebAssembly库是一个技术性较强的过程,主要涉及到FFmpeg的源码编译和WebAssembly的交叉编译。FFmpeg是一个强大的开源多媒体处理框架,广泛用于音视频的编码、解码、转码等任务。而...

    Linux下编译静态库和动态库1

    3. 最后,使用 gcc 编译器将 main.c 文件编译成可执行文件,并链接静态库,例如: ``` gcc main.c -o main -static -L. -lfunc ``` 使用静态库的优点是可以减少编译时间和空间,缺点是不能跨平台使用。 二、动态库 ...

    Linux环境编译gdal java环境用到的文件

    在Linux环境中编译GDAL(Geospatial Data Abstraction Library)并将其与Java环境集成是一项技术密集型的任务,涉及到多个步骤和依赖项。GDAL是一个强大的开源库,用于处理地理空间数据,支持多种数据格式和操作。...

    linux C库文件的建立和使用资料

    在Linux系统中,库文件是开发者复用代码和构建软件的基础。它们分为静态库和动态库,每种都有其特定的用途和优缺点。 1. **什么是库** ...掌握库的创建、使用和管理技巧,能够提高软件开发的效率和质量。

    C语言编写的CGI开发库(linux)

    本篇文章将深入探讨C语言与CGI结合在Linux下的开发实践,以及`cgilib-2.01-bin`这个库的特点和使用方法。 首先,理解CGI的基本原理是至关重要的。CGI允许Web服务器调用外部程序(如用C语言编写的应用),处理来自...

    linux pthread libc静态库

    总之,`pthread`和`libc`静态库是Linux开发中的重要组件,它们允许开发者编写多线程的C程序,并提供了一系列基础的C语言功能。在静态编译时,这些库被合并到最终的可执行文件中,提高了程序的移植性,但也可能导致...

    linux aarch64 ffmpegc gltransition 交叉编译so / a文件

    下面我们将详细讨论如何在Linux上交叉编译FFmpeg,特别是gltransition模块,以便生成适用于Android的动态链接库(.so)和静态链接库(.a)文件。 首先,确保你的开发环境已经配置了交叉编译工具链,例如Android NDK...

    编译ffmpeg生成的库文件,Android和Linux版本

    FFmpeg是一个开源项目,它包含了众多音视频处理的工具和库,被广泛应用于音视频的编码、解码、转码、流媒体处理等场景。在音视频开发领域,理解和掌握FFmpeg的使用对于开发者来说至关重要。这个压缩包"compiled_...

Global site tag (gtag.js) - Google Analytics