Linux C语言调用第三方库,第三方库如何编译安装

在 Linux 环境下使用 C 语言调用第三方库时,通常需要先对第三方库进行编译和安装。以下为你详细介绍一般的编译安装步骤,并给出不同类型第三方库(如使用 Makefile、CMake 构建系统)的具体示例。

一般步骤

1. 获取第三方库源码

一般可以从官方网站、代码托管平台(如 GitHub)等渠道下载第三方库的源代码压缩包,下载后将其解压到合适的目录。例如,使用 wget 下载并解压:

wget https://example.com/library.tar.gz
tar -zxvf library.tar.gz
cd library
包管理器安装(可选)

若库已收录在系统仓库,可直接通过包管理器安装:

sudo apt install libexample-dev  # Debian/Ubuntu
sudo yum install libexample-devel  # CentOS/RHEL

2. 配置编译环境

有些库需要根据系统环境进行一些配置,常见的配置方式有使用 configure 脚本或 CMake 工具。

3. 编译源码

根据配置结果,使用相应的编译工具(如 make)对源码进行编译。

4. 安装库文件

编译完成后,将生成的库文件、头文件等安装到系统指定的目录,方便后续使用。

不同构建系统的编译安装示例

使用 configure 和 make 构建的库

很多传统的开源库使用 configure 脚本来进行配置,然后使用 make 进行编译和安装。以下以一个示例库 example-library 为例:

# 进入库的源码目录
cd example-library# 运行 configure 脚本进行配置,该脚本会检查系统环境,确定编译所需的参数和依赖项,并生成相应的 Makefile 文件
./configure
./configure --prefix=/usr/local  # 指定安装到 /usr/local# 编译源码,根据 Makefile 文件中的规则编译源码,生成库文件和可执行文件。
make
make -j4  # 启用4线程加速编译# 安装库文件到系统目录(如 /usr/local/lib、/usr/local/include 等)
sudo make install

常用参数:
–enable-shared:生成动态库(.so)
–disable-static:禁用静态库(.a)
默认安装路径:
头文件:/usr/local/include
库文件:/usr/local/lib

使用 CMake 构建的库

现代的开源项目很多使用 CMake 来管理构建过程。以下是使用 CMake 构建库的示例:

# 进入库的源码目录
cd example-library# 创建一个独立的构建目录,避免污染源码目录。
mkdir build
cd build# 在构建目录中运行 cmake 命令,指定源码目录为上一级目录(..),生成 Makefile 文件。
cmake ..# 根据生成的 Makefile 编译源码。
make# 将编译好的库文件、头文件等安装到系统的标准目录。
sudo make install

其他注意事项

依赖项安装

在编译第三方库之前,需要确保系统已经安装了该库所需的依赖项。可以通过包管理器(如 apt、yum 等)来安装这些依赖项。例如,如果库依赖于 openssl,可以使用以下命令安装:

# Ubuntu/Debian 系统
sudo apt-get install libssl-dev# CentOS/RHEL 系统
sudo yum install openssl-devel

自定义安装路径

如果不想将库安装到系统的标准目录,可以在配置时指定自定义的安装路径。例如,使用 configure 脚本时可以使用 --prefix 选项:

./configure --prefix=/path/to/install

使用 CMake 时可以使用 -DCMAKE_INSTALL_PREFIX 选项:

cmake -DCMAKE_INSTALL_PREFIX=/path/to/install ..

环境变量配置

安装完成后,如果库安装在非标准路径,可能需要配置环境变量,以便系统能够找到这些库文件。可以通过设置 LD_LIBRARY_PATH 环境变量来实现:

export LD_LIBRARY_PATH=/path/to/install/lib:$LD_LIBRARY_PATH

为了使环境变量永久生效,可以将上述命令添加到 ~/.bashrc 或 ~/.bash_profile 文件中。

三、配置开发环境

头文件路径

编译时通过 -I 指定头文件目录:

gcc -I/usr/local/include -c main.c

库文件路径

链接时通过 -L 指定库目录,-l 指定库名(去除前缀 lib 和后缀):

gcc main.o -o app -L/usr/local/lib -lexample

运行时动态库路径

临时生效(终端会话内):

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

永久生效:

echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/custom.conf
sudo ldconfig

在这里插入图片描述

五、验证安装

测试程序

#include <example.h>  // 包含第三方库头文件
int main() {example_function();  // 调用库函数return 0;
}

编译并运行:

gcc -o test test.c -lexample && ./test

常见问题解决

​权限不足:安装时使用 sudo 提权
​头文件未找到:检查 -I 路径或手动复制头文件到 /usr/include
​链接失败:确认库名拼写正确,或通过 ldd app 检查依赖
通过以上步骤,可系统性地完成第三方库的编译安装与调用。具体实现细节需结合库的官方文档调整

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux基本命令(1)--linux下的打包命令 -- tar 和gzip

tar 解压 &#xff0c;打包 语法&#xff1a;tar [主选项辅选项] 文件或者目录 使用该命令时&#xff0c;主选项是必须要有的&#xff0c;它告诉tar要做什么事情&#xff0c;辅选项是辅助使用的&#xff0c;可以选用。 主选项&#xff1a; c 创建新的档案文件。如果用户想备…

Python 序列构成的数组(对序列使用+和_)

对序列使用和* Python 程序员会默认序列是支持 和 * 操作的。通常 号两侧的序列由 相同类型的数据所构成&#xff0c;在拼接的过程中&#xff0c;两个被操作的序列都不会被 修改&#xff0c;Python 会新建一个包含同样类型数据的序列来作为拼接的结果。 如果想要把一个序列…

[ C语言 ] | 从0到1?

目录 认识计算机语言 C语言 工欲善其事必先利其器 第一个C语言代码 这一些列 [ C语言 ] &#xff0c;就来分享一下 C语言 相关的知识点~ 认识计算机语言 我们说到计算机语言&#xff0c;语言&#xff0c;就是用来沟通的工具&#xff0c;计算机语言呢&#xff1f;就是我们…

【通道注意力机制】【SENet】Squeeze-and-Excitation Networks

0.论文摘要 卷积神经网络建立在卷积操作的基础上&#xff0c;通过融合局部感受野内的空间和通道信息来提取有意义的特征。为了增强网络的表示能力&#xff0c;最近的一些方法展示了增强空间编码的好处。在本研究中&#xff0c;我们专注于通道关系&#xff0c;并提出了一种新颖…

kubernetes Calico(CNI) NetworkPolicy 流量管理 设置networkpolicy 策略 下集

1、kubernetes 网络策略&#xff08;网络隔离策略&#xff09; Network Policy 是 Kubernetes 中用于控制 Pod 之间网络通信的一种机制。它通过定义规则&#xff0c;限制哪些 Pod 或外部实体可以与目标 Pod 通信&#xff08;基于标签、命名空间、端口等&#xff09;。Network …

sqlmap基础命令总结

​注意事项:仅用于授权测试&#xff0c;避免非法使用。 目录 ​一、基础命令 ​二、数据库信息获取 ​三、绕过 WAF/IDS ​四、文件系统与系统命令 ​五、高级功能与优化 ​六、实战示例 ​一、基础命令 ​检测注入点 sqlmap -u "http://target.com/index.php?id1&…

Unity光线传播体积(LPV)技术实现详解

一、LPV技术概述 光线传播体积(Light Propagation Volumes)是一种实时全局光照技术&#xff0c;通过将场景中的间接光信息存储在3D网格中&#xff0c;实现动态物体的间接光照效果。 核心优势&#xff1a; 实时性能&#xff1a;相比传统光照贴图&#xff0c;支持动态场景 硬件…

SpringBoot (一) 自动配置原理

目录 一 自动配置 1:数据源的手动配置 1:SpringBoot的自动配置 二 自动配置的完整流程&#xff1a;&#xff08;底层&#xff09; 1. 场景化依赖与Starter机制 2. 主程序入口与注解驱动 3. 自动配置类的加载与筛选 4. 自动配置类的实现逻辑 5. 自动配置的触发与执行流…

OJ题:移动零

双指针法 c 语言实现 void moveZeroes(int* nums, int numsSize) {int dest,cur; //创建临时指针和目标指针destcur0;//出初始化while(cur<numsSize)//遍历{if(nums[cur]!0){swap(&nums[cur],&nums[dest]);cur;dest;}else{cur;}}} 思路是建立两个指针&#xff0…

pycharm终端操作远程服务器

pycharm项目已经连接了远程服务器&#xff0c;但是打开终端&#xff0c;却依旧显示的是本地的那个环境&#xff0c;也就是说没有操作远程的那个环境。只能再使用Xshell去操作远程环境&#xff0c;很麻烦&#xff0c;找了下教程。 来源&#xff1a;https://blog.csdn.net/maolim…

(头歌作业—python)3.2 个人所得税计算器(project)

第1关&#xff1a;个人所得税计算器 任务描述 本关任务&#xff1a;编写一个个人所得税计算器的小程序。 相关知识 个人所得税缴纳标准 2018 年 10 月 1 日以前&#xff0c;个税免征额为 3500 元/月&#xff0c;调整后&#xff0c;个税免征额为 5000 元/月&#xff0c; 7 级超…

Redis场景问题1:缓存穿透

Redis 缓存穿透是指在缓存系统&#xff08;如 Redis&#xff09;中&#xff0c;当客户端请求的数据既不在缓存中&#xff0c;也不在数据库中时&#xff0c;每次请求都会直接穿透缓存访问数据库&#xff0c;从而给数据库带来巨大压力&#xff0c;甚至可能导致数据库崩溃。下面为…

CUDA Memory Fence 函数的功能与硬件实现细节

CUDA Memory Fence 函数的功能与硬件实现细节 Memory Fence 的基本功能 CUDA中的memory fence函数用于控制内存操作的可见性顺序&#xff0c;确保在fence之前的内存操作对特定范围内的线程可见。主要功能包括&#xff1a; 排序内存操作&#xff1a;确保fence之前的内存操作在…

实战篇Redis

黑马程序员的Redis的笔记&#xff08;后面补一下图片&#xff09; 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

Reactive编程:什么是Reactive编程?Reactive编程思想

文章目录 **1. Reactive编程概述****1.1 什么是Reactive编程&#xff1f;****1.1.1 Reactive编程的定义****1.1.2 Reactive编程的历史****1.1.3 Reactive编程的应用场景****1.1.4 Reactive编程的优势** **1.2 Reactive编程的核心思想****1.2.1 响应式&#xff08;Reactive&…

异步转同步,实现一个消息队列

有一个场景&#xff0c;需要实现一个消息队列&#xff0c;要求 1&#xff0c;3&#xff0c;4 秒后&#xff0c;依次打印 1&#xff0c;2&#xff0c;3&#xff0c;如下&#xff1a; 其实考察的是怎么用同步的方式实现异步。 本文总结了四种方式实现&#xff1a;常规嵌套、prom…

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望 #微服务实战 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事务 #Seata #ServiceMesh #总结 #SpringCloud #SpringBoot 系列终章&#xff1a;经过前九篇 [【深度 Mape 系列】] 的系统学习…

求职笔试题

PDD 最长公共子序列 1143-最长公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二维动态规划"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 这种写法错误&#xff0c;m1行…

【MySQL基础-16】MySQL DELETE语句:深入理解与应用实践

1. DELETE语句基础&#xff1a;数据删除的艺术 在数据库管理中&#xff0c;DELETE语句是维护数据完整性和清理过期信息的关键工具。与日常生活中的"删除"不同&#xff0c;数据库中的删除操作需要更加谨慎和精确&#xff0c;因为数据一旦删除&#xff0c;恢复可能非常…

python学习笔记(3)——元组

Python3 元组全面详解 一、元组的定义与特性 基本概念 元组(Tuple)是Python中的不可变序列,用小括号()表示,元素用逗号分隔。与列表不同,元组一旦创建,元素不能修改、添加或删除(元素本身为可变对象的情况除外)。 不可变性 • 元组的每个元素的引用不可变,但若元素是可…