首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux g 编译so

Linux gcc 编译动态链接库(.so)基础概念及操作指南

基础概念

动态链接库(Dynamic Link Library)

  • 动态链接库是在程序运行时加载的共享库,允许多个程序共享同一份库代码。
  • 在Linux系统中,动态链接库通常以 .so(Shared Object)为扩展名。

gcc编译器

  • gcc 是GNU编译器套件的一部分,用于编译C、C++等语言编写的程序。

编译动态链接库的优势

  1. 节省磁盘空间:多个程序可以共享同一份库文件,而不是每个程序都包含一份副本。
  2. 便于更新和维护:只需更新库文件,所有依赖该库的程序都能受益。
  3. 提高内存利用率:运行时加载库,多个进程可以共享库的内存映射。

类型与应用场景

  • 标准库:如 libc.so,提供基础的系统调用和常用函数。
  • 第三方库:如 libcurl.so,用于网络通信;libssl.so,用于加密通信。
  • 自定义库:开发者根据项目需求创建的特定功能库。

应用场景广泛,包括但不限于网络应用、图形处理、数据分析等领域。

编译步骤与示例代码

假设我们有一个简单的C文件 mylib.c,其中定义了一个函数 int add(int a, int b)

  1. 编写源代码
  2. 编写源代码
  3. 编译生成动态链接库
  4. 编译生成动态链接库
    • -shared 选项指示编译器生成共享库。
    • -o libmylib.so 指定输出文件名为 libmylib.so
  • 使用动态链接库: 创建另一个C文件 main.c 来调用 libmylib.so 中的函数。
  • 使用动态链接库: 创建另一个C文件 main.c 来调用 libmylib.so 中的函数。
  • 编译并链接主程序
  • 编译并链接主程序
    • -L. 表示在当前目录下查找库文件。
    • -lmylib 表示链接名为 libmylib.so 的库(去掉前缀 lib 和后缀 .so)。
  • 运行程序: 确保动态链接库在运行时路径中,可以通过设置 LD_LIBRARY_PATH 环境变量来实现。
  • 运行程序: 确保动态链接库在运行时路径中,可以通过设置 LD_LIBRARY_PATH 环境变量来实现。

常见问题及解决方法

问题1:找不到动态链接库

  • 原因:运行时系统无法找到指定的 .so 文件。
  • 解决方法:确保库文件存在于 LD_LIBRARY_PATH 指定的目录中,或将其复制到系统库目录(如 /usr/lib)。

问题2:版本冲突

  • 原因:不同版本的库文件冲突。
  • 解决方法:使用命名约定(如 libmylib.so.1)来区分不同版本,并在编译时明确指定所需版本。

问题3:编译错误

  • 原因:源代码中存在语法错误或链接错误。
  • 解决方法:仔细检查源代码,使用 gcc 的详细输出选项(如 -Wall)来获取更多错误信息,并逐一解决。

通过以上步骤和方法,你可以顺利地在Linux环境下使用 gcc 编译和使用动态链接库。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 反编译so库破解so

    所以想破解so,将对i2c num 的大小改大点。...基础知识: (1)了解反编译成汇编后的结构,以及常用的汇编指令的意义 https://bbs.ichunqiu.com/thread-41629-1-1.html?...from=sec (2)实战预热 https://blog.csdn.net/m0_37766442/article/details/72903385 一、反编译so 使用IDA打开so 根据log信息或猜测查找需要破解的大致位置...我们看到上方有一个 loc_82036,这代表一段代码的标签处,类似C里面goto 的标签,那肯定其他地方会向这个标签做跳转 选中这个标签,右击 点击红框选项,就会列出所有向此处跳转的地方,这个so,...点中CMP R0,#6的地址处,然后切换到HEX View Hex VIEW 可以切换数据格式,64位so用4字节格式,32位so用2字节格式 我们需要将CMP R0,#6 改成CMP R0,#8

    4.7K30

    linux编译curl库的动态库so

    在windows下还是很容易使用,如何使用的案例比比皆是,而且很容易就找到已经编译好的动态库进行测试,但是最后在linux下部署的时候,发现不好找已经编译好的so库文件,最后没办法只好自理更生。...下载了源码下来看,配置文件看得一塌糊涂,在网上查了一些资料,也很少找到有用的信息,最后结合自己的理解和网上的资料,总算把curl编译成功了,再此记录一下,方便以后查阅,也希望能帮助到其它遇到此问题的朋友们...我是使用腾讯的SDK里面附带的curl库的源码(ps,腾讯SDK的示例代码貌似没在linux测试过,我编译后使用他们的代码,发现很容易崩溃,需要修改才能运行,但是windows正常)。...然后,对下载的源码解压,然后进入解压后的目录,然后配置编译选项,然后编译。 # ....包含了编译生产的库、头文件等。 然后为了能够方便的移植我们的程序,把include/lib下面的头文件和so库文件拷贝到自己的工程目录就能使用curl库了。

    6.5K10

    libyuv编译Android平台so

    Android FFmpeg系列09--抽帧与快速抽帧文章里用到了libyuv来将FFmpeg解码的视频AVFrame统一转化为RGBA格式输出 这篇文章我们来简单聊聊Android平台下libyuv so...的编译和使用 两年前写过类似文章libyuv的编译与使用,当时是AS直接导入libyuv源码进行编译,今天我们在终端窗口用ndk-build来完成so的编译 源码下载 git clone https:...LOCAL_MODULE := libyuv_unittest include $(BUILD_NATIVE_TEST) 添加Application.mk 指定输出so的架构平台和Android版本...ndk-build 编译过程 编译产物 使用示例 将头文件和编译产物libs目录下的so导入AS中 CmakeLists.txt引入 # libyuv set(libyuv_lib_dir...IMPORTED ) set_target_properties(yuv PROPERTIES IMPORTED_LOCATION ${libyuv_lib_dir}/libyuv.so

    1.8K30

    Linux环境g++编译GDAL动态库

    一、编译步骤 解压下载的GDAL源程序,并在命令行中切换到解压目录。.../configure --prefix=/root/Test/gdalbuild 这时可以发现目录中新生成了GDALmake.opt文件,该文件被包含在GNUmakefile中进行编译。...输入命令: make make install 编译完成后,生成的动态库文件就在设置的目录下。...二、注意说明 1)注意这里是生成在自己设置目录而不是默认目录下,调用的时候需要设置环境变量或者拷贝到系统的lib目录,或者不用设置—prefix参数编译。...一般而言,release版本总比debug版本信息小一点,而按照这篇文章《Linux下查看.so和可执行文件是否debug编译》进行检查是否debug编译,发现两者都是存在debug信息的,release

    3.8K20

    C编译: 动态连接库 (.so文件)

    /test 执行程序 运行程序 尽管我们成功编译了test可执行文件,但很有可能不能执行。一个可能是权限问题。我们需要有执行该文件的权限,见Linux文件管理背景知识 另一个情况是: ....libmystack.so位于当前路径,位于库文件的默认路径之外。尽管我们在编译时(compile time)提供了.so文件的位置,但这个信息并没有写入test可执行文件(runtime)。...显示: linux-vdso.so.1 => (0x00007fff31dff000) libmystack.so => not found libc.so.6 => /lib.../x86_64-linux-gnu/libc.so.6 (0x00007fca30de7000) /lib64/ld-linux-x86-64.so.2 (0x00007fca311cb000)...这样做的坏处是,如果库文件移动位置,我们需要重新编译test。使用如下命令编译test.c: $gcc -g -o test test.c -lmystack -L. -Wl,-rpath=.

    2.8K70

    【linux学习指南】Linux编译器 gcc和g++使用

    动态库: .so (linux).dll(windows) 静态库: .a (linux).lib 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时...linux-vdso.so.1: 这是一个虚拟动态共享对象(VDSO),用于提供一些内核功能的用户空间接口。它通常用于提高系统调用的效率。.../lib64/ld-linux-x86-64.so.2: 这是动态链接器(或加载器),负责在程序运行时加载所需的共享库并进行链接。它的加载地址是 0x00007f11a5540000。...c 编译到目标代码 o 文件输出到 文件 static 此选项对生成的文件采用静态链接 g 生成调试信息。...文件扩展名 使用 gcc 编译的源文件通常是 .c 文件,而使用 g++ 编译的源文件通常是 .cpp 或 .cc 文件。

    20810

    FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库

    为了让ijkplayer能够在更新的开发环境上正常运行,需要先在Linux系统上交叉编译ijkplayer在Android平台上的so文件,才能在App工程中导入并调用so库。...下面介绍如何在Linux编译ijkplayer的so库。一、准备Linux编译环境首先在Linux系统执行下面命令安装编译工具。...mount -o remount,size=2G /tmp二、安装Android的SDK和NDK依次执行下列命令下载并安装Android的SDK,注意不要用太高版本的SDK,因为ijkplayer没有适配高版本的.../init-android.sh然后依次执行下列命令,分别编译ijkplayer需要的openssl库和ffmpeg库,以及ijkplayer的so库。...之所以在三个脚本后面添加“ arm64”,是为了只编译适配arm64指令的so文件。cd android/contrib./compile-openssl.sh arm64.

    24810

    linux 什么是SO文件

    下面的内容大多都是连接中的,穿插我自己的笔记 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。 1.so文件是什么?...:得到输出文件libs.o gcc -fPIC -g -c s.c -o libs.o ———————————————————————- -fPIC: -fPIC作用于编译阶段,告诉编译器产生与位置无关代码...———————————————————————- 链接:得到输出文件libs.so gcc -g -shared -Wl,-soname,libs.so -o libs.so libs.o -lc...printf("TS Quit\n"); } 编译链接这个文件:得到输出文件ts gcc -g ts.c -o ts -L. -ls 执行./ts,嗯:成功了。。。...so文件:得到libb.so gcc -fPIC -g -c b.c -o libb.o gcc -g -shared -Wl,-soname,libb.so -o libb.so -lc

    5.8K20

    NDK 是什么 | FFmpeg 5.0 编译 so 库

    本文我们来通过 NDK 对 FFmpeg 5.0 进行编译,生成动态链接库 so 。 注:本文的 Java 泛指 JVM 语言,不要拿 Kotlin 抬杠,本质太大的区别 。...其余的东西暂时对我们来说并没有什么太大的意义,现在我们的目的是通过这个源码通过 NDK 来编译成在 Android 中可以使用的动态链接库 so 文件。...可能会有人疑惑,那就是 so 库嘛,下载别人的用不就完事了吗?原因很简单,自己编译 FFmpeg 可以手动设置需要的功能,如果直接别人编译好的,就没有设置的机会。...项目结构 在 cpp 文件夹中处理 c++ 相关内容,jniLibs 文件夹放入文件编译的 so 库: ---- 3....其实仔细想想,项目中的 C++ 文件也是被 NDK 编译成 libtolyffmpeg.so 库,才能被 Java 所调用。

    1.4K21
    领券