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

linux 库编译

在Linux系统中,库编译是一个重要的过程,它涉及到将源代码编译成可被程序调用的库文件。以下是关于Linux库编译的基础概念、优势、类型、应用场景以及可能遇到的问题和解决方案:

基础概念

库(Library)是一组预先编译的代码,可供其他程序调用以实现特定功能。Linux中的库主要分为静态库和动态库两种。

优势

  1. 代码复用:库允许开发者复用已有的代码,减少重复工作。
  2. 模块化:库提供了模块化的编程方式,便于管理和维护。
  3. 提高效率:通过调用库中的函数,可以加速程序的开发速度。

类型

  1. 静态库(.a文件):在编译时被链接到目标程序中,成为程序的一部分。优点是程序运行时不需要额外的库文件,但缺点是程序体积较大。
  2. 动态库(.so文件):在运行时被加载到内存中,多个程序可以共享同一个动态库。优点是节省内存和磁盘空间,但需要确保运行时库文件的存在。

应用场景

  • 静态库:适用于对程序体积要求不严格,且希望程序独立运行的场景。
  • 动态库:适用于需要节省资源,且多个程序可以共享相同功能的场景。

编译过程

  1. 编写源代码:首先需要编写库的源代码。
  2. 编译源代码:使用gcc等编译器将源代码编译成目标文件(.o文件)。
  3. 创建库文件
    • 对于静态库,使用ar命令将目标文件打包成.a文件。
    • 对于动态库,使用gcc命令的-shared选项将目标文件编译成.so文件。

可能遇到的问题及解决方案

  1. 找不到库文件:确保库文件路径在系统的库搜索路径中,或者使用LD_LIBRARY_PATH环境变量指定库文件路径。
  2. 版本冲突:避免安装多个版本的相同库文件,或者使用符号链接指向正确的库文件版本。
  3. 编译错误:仔细检查源代码和编译命令,确保语法正确且编译选项合适。

示例代码

假设我们有一个简单的数学库,包含两个函数:addsubtract

math.c

代码语言:txt
复制
int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

编译静态库

代码语言:txt
复制
gcc -c math.c -o math.o
ar rcs libmath.a math.o

编译动态库

代码语言:txt
复制
gcc -fPIC -c math.c -o math.o
gcc -shared -o libmath.so math.o

使用库

代码语言:txt
复制
#include <stdio.h>

extern int add(int, int);
extern int subtract(int, int);

int main() {
    printf("Add: %d\n", add(5, 3));
    printf("Subtract: %d\n", subtract(5, 3));
    return 0;
}

编译并运行使用库的程序:

代码语言:txt
复制
gcc main.c -L. -lmath -o main
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux 编译动态库_makefile编译动态库

生成动态链接库 生成动态链接库的命令比较简单: 2.1 使用-shared 告诉编译器生成一个动态链接库 2.2 使用选项-fPIC或者-fpic,使得生成的代码与位置无关 gcc -shared -Wl.../usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/mesa-egl /usr/lib/x86_64-linux-gnu/mesa # Legacy...使用动态链接库 在编译程序的时候,使用动态链接库和静态链接库是一致的, 使用“-l库名”的形式,编译器在生成可执行文件的时候会链接该链接库文件。..../ -lstr -L : 指定链接动态库的路径 -lstr : 制定链接的动态库名称 这里需要注意的是: 编译的链接动态库和运行的动态链接库并不一致。...思路如下: 在某个特定目录放不同模块编译生成的动态库; 程序中遍历该目录下所有的符合条件的动态库,然后打开动态库获取相关函数(例如module_init()),一般为模块的注册或者初始化函数,完成相应模块的加载或初始化操作

6.2K20

linux编译curl库的动态库so

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  curl库是一个很强大的http开源库,c++里面能够很方便的和http服务器交互。...在windows下还是很容易使用,如何使用的案例比比皆是,而且很容易就找到已经编译好的动态库进行测试,但是最后在linux下部署的时候,发现不好找已经编译好的so库文件,最后没办法只好自理更生。...我是使用腾讯的SDK里面附带的curl库的源码(ps,腾讯SDK的示例代码貌似没在linux测试过,我编译后使用他们的代码,发现很容易崩溃,需要修改才能运行,但是windows正常)。...然后,对下载的源码解压,然后进入解压后的目录,然后配置编译选项,然后编译。 # ....包含了编译生产的库、头文件等。 然后为了能够方便的移植我们的程序,把include/lib下面的头文件和so库文件拷贝到自己的工程目录就能使用curl库了。

6.5K10
  • Linux交叉编译Windows静态库

    在本文中,我们将介绍Linux交叉编译Windows的静态库。 unsetunset什么是静态库?...unsetunset从 Linux 交叉编译适用于 Windows 的静态库unsetunset 从 Linux 交叉编译 Windows 的静态库是一个相当简单的过程。...交叉编译 Linux 上的静态库以用于 Windows 是开发人员必备的一项技能。它可以帮助您创建兼容多个平台的软件,提高您的工作效率,并从长远来看节省您的时间和金钱。...除了上面概述的步骤之外,在为 Windows 从 Linux 交叉编译静态库时还需要记住一些事项: 平台特定代码− 交叉编译时,请务必记住代码可能在不同的平台上运行。...总体而言,从 Linux 交叉编译静态库到 Windows 是开发人员必备的一项技能。通过遵循本文概述的步骤并牢记上述注意事项,你可以创建与多个平台兼容的高质量软件。

    38110

    Linux基础——gcc编译、静态库与动态库(共享库)

    gcc编译器 1、gcc工作流程 2、gcc常用参数 参数 用途 -v 查看版本 -o 产生目标文件 -I+目录 指定头文件目录 -D 编译时定义宏 -00/-01/-03 没有优化/缺省值.../优化级别最高 -Wall 提示更多警告信息 -c 只编译子程序 -E 生成预处理文件 -g 包含调试信息 静态库 1、静态库的命名格式 lib + 库的名字 + .a 例:libMyTest.a...,在编译过程中仅简单的引用,因此代码体积较小。...优点: 节省内存 易于更新,不用重新编译可执行程序,运行时自动加载 缺点: 延时绑定,速度略慢 3、动态库的制作与使用 测试代码的目录结构与静态库相同。.../app (执行失败,找不到链接库,没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径) 第二种方法: gcc + 源文件 + -I头文件 + libxxx.so

    8.7K40

    【Linux 内核】编译 Linux 内核 ⑥ ( 安装 OpenSSL | 安装其它依赖库 | 内核编译完成 )

    文章目录 一、安装 OpenSSL 二、安装其它依赖库 三、Linux 内核编译完成 一、安装 OpenSSL ---- 参考 【错误记录】编译 Linux 内核报错 ( fatal error: openssl...Setting up libssl-doc (1.0.2g-1ubuntu4.20) ... root@ubuntu:~/kernel/linux-5.6.14# 二、安装其它依赖库 ---- 编译...Linux 内核还需要安装如下软件包或依赖库 : gcc libncurses5-dev build-essential kernel-package libssl-dev kernel-source...build-essential kernel-package libssl-dev kernel-source-** libc6-dev tk8.* fakeroot bin86 命令 , 安装上述 9 个依赖库...; 三、Linux 内核编译完成 ---- 在 Linux 内核源码根目录中 , 执行 sudo make 命令 , 等待几小时后 , 在最后打印出如下内容 , 期间没有报错 , 即表示编译完成 ;

    22.6K40

    全志Tina Linux下如何编译glibc库

    第4行是gcc位置,第5行是make工具位置(不需要安装高版本make可以去掉),第7行是glibc版本,第12行是glibc源码路径,第13行是glibc生成库文件路径,第14行是glibc编译过程产生中间文件存放路径...第30-33行,用于编译glibc。 其中31行 --host=arm-none-linux-gnueabihf ,host填入值要和gcc匹配 ,否则会出差。 运行env.sh脚本 env.sh ....编译完成后,我们看到对应so库 替换glibc,例如在我们测试demo,修改Makefile,指定到我们glibc版本路径即可 重新编译,查看对应执行文件,看到已经使用对应版本版本glibc库 strings...main | grep glibc 版本匹配问题 1、gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi版本,glibc 2.29以下版本都可以编译通过...2、gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf版本,目前只在glibc 2.33编译通过,其他版本需测试。

    26510

    Linux gcc编译生成静态库和共享动态库的过程

    这篇文章主要通过实例演示在Linux下如何使用gcc分别编译生成静态库和动态库文件以及其它程序如何使用这个生成的静态库和动态库。...3.1 直接编译生成symbolic link动态库文件 ##### 生成hello.o目标文件 [root@typecodes ~]# gcc -c -fPIC hello.c ##### 生成动态库文件...Linux系统动态库搜索目录下。...1、添加库路径到 /etc/ld.so.conf.d/ 目录下的配置文件中,然后执行命令ldconfig; 2、添加库路径到 LD_LIBRARY_PATH 环境变量中; 3、在编译链接命令中加入参数...-rpath=库文件所在路径 ; 4、最简单的方式:把库文件拷贝到Linux系统库文件所在目录下(/lib、/lib64、/usr/lib、/usr/lib64、/usr/local/lib等)。

    70021

    Linux下关于动态库的说明 | 编译以及调用

    可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库。...动态库是一种在已经编译完毕的程序开始启动运行时,才被加载来调用其中函数的库。其加载方式与静态库截然不同。...---- 动态库的命名 ​ Linux下,动态库通常以.so(shareobject)结尾。...即,程序与静态库编译链接后,即使删除静态库文件,程序也可正常执行。 ​ 动态库正好相反,在编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。...在linux下可以用export命令来设置这个值,在linux终端下输入: export LD_LIBRARY_PATH=/opt/au1200_rm/build_tools/bin: $LD_LIBRARY_PATH

    2.2K40
    领券