linux之librdkafka库安装以及将#include <librdkafka/rdkafka.h>更改为#include <rdkafka.h>调用

2023-10-26

公众号:嵌入式不难

本文仅供参考学习,如有错误之处,欢迎留言指正。

下载源代码

使用如下命令 git clone https://github.com/edenhill/librdkafka.git

切换到发布的稳定分支

刚下载下来的源代码默认在master/main分支, 最好切换到tag版本, 源分支如下
在这里插入图片描述
使用 git tag --list 列出存在的分支
使用 git switch -c tag_v1.8.2 v1.8.2 切换到想要的分支
在这里插入图片描述

执行编译三部曲

执行命令 ./configure && make && sudo make install

./configure

作用: 1.首先检查机器的一些配置和环境,系统的相关依赖, 如果缺少依赖, 则脚本会自动停止
2.配置 Makefile 中的参数, 比如编译器, 库路径…
./configure --prefix=/软件要安装的路径 //将软件安装到指定的路径
./configure //未指定安装路径时, 通常默认路径都是/usr/local/
./configure --help //查看帮助文件

make

作用: 编译

make install

作用: 编译后的处理, 比如把文件移动到指定目录, 对于该库来说拷贝已经编译好的库文件, 将librdkafka下的头文件和动态库安装到/usr/local/include/和/usr/local/lib/下
该命令执行完成后, 会有如下变化

  1. /usr/local/include/ 文件夹下会新增 librdkafka 文件夹
    librdkafka 内部的文件如下
    rdkafkacpp.h rdkafka.h rdkafka_mock.h
  2. /usr/local/lib/ 文件下会新增一些动态链接库文件, 新增文件如下
    librdkafka.a librdkafka++.a librdkafka.so librdkafka++.so librdkafka.so.1 librdkafka++.so.1 pkgconfig python2.7 python3.5

sudo ldconfig

作用: 将/etc/ld.so.conf中的路径缓存到/etc/ld.so.cache中,因此在安装完一些库文件或者修改 ld.so.conf 或者在 ld.so.conf.d 目录下新增 *.conf 文件后需要运行一下ldconfig使所有的库文件都缓存都ld.so.cache中,如果没有运行ldconfig,即使库文件就在/etc/ld.so.conf中,也是不会被使用的,结果在编译的过程中同样报错缺少库!
ldconfig指令存放于/sbin/ldconfig

/etc/ld.so.conf: 记录编译时使用的动态链接库的路径
cat /etc/ld.so.conf //cmd 展示内容如下
include /etc/ld.so.conf.d/*.conf
//含义为include /etc/ld.so.conf.d/下所有.conf结尾的文件

/etc.ld.so.conf.d: 保存动态链接库路径
cd /etc/ld.so.conf.d //cmd 进入目录
ls //cmd 结果如下
fakeroot-x86_64-linux-gnu.conf
vmware-tools-libraries.conf
x86_64-linux-gnu_EGL.conf
libc.conf
x86_64-linux-gnu.conf
x86_64-linux-gnu_GL.conf
cat libc.conf //cmd 展开 libc.conf 如下
/usr/local/lib

开始码代码

#include <rdkafka.h>

int main(int argc, char *argv[])
{
    rd_kafka_conf_t *conf;

    conf = rd_kafka_conf_new();
    (void)conf;
    return 0;
}

第一次编译

gcc test.c -o test结果如下
在这里插入图片描述
三部曲都已经没有问题了, 确报无法找到头文件, 那我就来解决这个问题
由于需要引用librdkafka的库函数, 就需要添加rdkafka*.h头文件, 但是头文件存在于 /usr/local/include/librdkafka中, 那我们怎么知道gcc在编译的时候是按照什么策略在搜索头文件的呢? 采用echo | gcc -x c -v -E -或者cpp -v指令来查看相关策略,结果如下
#include “…” search starts here:
#include <…> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
通过上面的知识可以知道include搜索头文件的目录只到/usr/local/include, 所以写代码的时候仅仅使用 #include <rdkafka.h> 是无法引用到头文件的, 应该使用 #include <librdkafka/rdkafka.h>
echo | gcc -x c -v -E -查看gcc预处理C时的的搜索目录
echo | gcc -x c++ -v -E -查看gcc预处理C++时的的搜索目录

第二次编译

#include <librdkafka/rdkafka.h>

int main(int argc, char *argv[])
{
    rd_kafka_conf_t *conf;

    conf = rd_kafka_conf_new();
    (void)conf;
    return 0;
}

gcc test.c -o test结果如下
在这里插入图片描述
这次没有报找不到头文件故障了

第三次编译

那如果我偏偏要使用#include <rdkafka.h> 呢, 也不是不可以, 这里我们就需要另外的一个知识了, 我们要知道当编译#include <rdkafka.h> 的时候, 编译器第一步是从当前目录查找是否含有这个文件, 没有的话就从echo | gcc -x c -v -E -输出列表里面出现的目录去查找, 很明显, 这两个条件都不满足, 所以我们可以在使用gcc 编译的时候告诉编译器rdkafka.h 的位置, 使用方法是 gcc … -I /usr/local/include/librdkafka, 这样就可以了, 但是这样又存在一个问题, 我每次编译的时候都去输入一遍路径, 岂不是很麻烦, 有时候忘了就编译错误了, 那怎么办呢, 这个时候就需要使用C_INCLUDE_PATH 环境变量了, gcc 在编译的时候会查找这个环境变量的值, 并将环境变量的值展开, 添加到gcc 的编译参数里去, 而如何添加C_INCLUDE_PATH环境变量呢? 环境变量存在于/etc/profile 文件中, 使用export C_INCLUDE_PATH=/usr/local/include/librdkafka 就可以了, 而当我编译的, 怎么还有问题, 使用echo $C_INCLUDE_PATH 的时候, 居然为空, 然后我又一步步查, 最终查到了, 我使用的bash是ohmyzsh, 可能没有拿到/etc/profile 的配置信息, 所以我还需要将export C_INCLUDE_PATH=/usr/local/include/librdkafka 添加到zsh的环境变量里, zsh环境变量配置文件为 ~/.zshrc , 加入之后再重启一下系统就可以使用C_INCLUDE_PATH环境变量了

#include <rdkafka.h>

int main(int argc, char *argv[])
{
    rd_kafka_conf_t *conf;

    conf = rd_kafka_conf_new();
    (void)conf;
    return 0;
}

gcc test.c -o test结果如下
在这里插入图片描述
是我想看到的结果, 至少没有报找不到头文件

第四次编译

上面的编译都还是没有成功, 这下该解决对‘rd_kafka_conf_new’未定义的引用 问题了, 上面的问题是虽然找到了头文件, 但是无法链接到库文件, 而链接到库文件需要在编译时加上 -lrdkafka, 这里的 -lrdkafka 表示对动态链接库 rdkafka 的引用
gcc test.c -o test -lrdkafka结果如下
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux之librdkafka库安装以及将#include <librdkafka/rdkafka.h>更改为#include <rdkafka.h>调用 的相关文章

随机推荐

  • Python数据可视化之条形图和热力图

    Python数据可视化之条形图和热力图 提示 介绍 简单介绍Pthon可视化的图表使用 提示 热力图和条形图 文章目录 Python数据可视化之条形图和热力图 前言 一 导入数据包 二 选择数据集 2 加载数据 2 读入数据 总结 前言 提
  • vue 二级级联菜单

    ul class sidebar menu li li ul
  • carplay是否可以用安卓系统_carplay能连接安卓手机吗

    carplay能连接安卓手机吗 carplay并不可以连接安卓手机 这一系统只能连接苹果的设备 有非常多车基本都有carplay功能 假如有这一功能 那么就可以将手机与自己的苹果手机连接起来 这样子可以导航 接打电话 用语音助手调节车机 听
  • 微信小程序之数据缓存

    在H5之前 缓存一般都是用cookie 但是cookie的存储空间太小 于是 H5增加了新的缓存机制 即localstorage 和 sessionstorage 具体的介绍就不在多说 在微信小程序中 数据缓存其实就和localstorag
  • 前端URL编码与解码:理解、应用与实践

    目录 什么是URL编码和解码 为什么需要URL编码和解码 1 特殊字符处理 2 支持非ASCII字符 3 SEO优化与用户体验 JavaScript中的URL编码和解码 URL编码示例 URL解码示例 实际应用场景 1 处理查询参数 2 构
  • Vue-CLI and Leaflet(2):地图基本操作(放大,缩小,平移,定位等)

    一 Vue CLI and Leaflet 起步 在 Vue CLI 中使用 Leaflet 二 Vue CLI and Leaflet 地图基本操作 放大 缩小 平移 定位等 三 Vue CLI and Leaflet 添加 marker
  • 《caffe学习之路》第一章:Ubuntu16.04 cuda及cudnn环境搭建

    这里我们选择一种简单的方式搭建cuda环境 那就是JetPack他会自动安装最新的驱动 CUDA Toolkit cuDNN TensorRT Opencv Python等 环境 系统 Ubuntu16 04 显卡 NVIDIA GTX20
  • Java 8系列之重新认识HashMap

    摘要 HashMap是Java程序员使用频率最高的用于映射 键值对 处理的数据类型 随着JDK Java Developmet Kit 版本的更新 JDK1 8对HashMap底层的实现进行了优化 例如引入红黑树的数据结构和扩容的优化等 本
  • vs2015的OpenCV3.2.0编译

    我们希望添加第三方功能模块和库或者针对特定cpu和gpu的编译调整优化选项 这样的需求就需要自己去编译opencv了 准备东西 opencv opencv contrib cmake 还有两个文件 因为可能是国内的原因 在configure
  • eviews建立时间序列模型_如何用eviews分析时间序列(全面).pdf

    您所在位置 网站首页 gt 海量文档 nbsp gt nbsp中学教育 nbsp gt nbsp高中教育 如何用eviews分析时间序列 全面 pdf70页 本文档一共被下载 次 您可全文免费在线阅读后下载本文档
  • 二层组播和三层组播

    平时常常说组播 其实只是多播的另外一种叫法 多播中 因为把参与多播的所有接收者称为组 所以才有组播的说法 多播技术要比广播技术复杂的多 多播技术对一些应用很重要 比如电视会议 聊天室等 物理层多播 系统需要对网络接口进行配置 让接口识别该地
  • MATLAB行向量顺序颠倒函数 - fliplr

    fliplr A 只可用于行向量 列向量不行 实例 1 行向量 2 列向量
  • 如何使用正则表达式实现Java日志信息的抓取与收集

    首先 什么是Java日志信息 简单来说 Java应用程序在运行过程中会输出一些信息 这些信息可以用来追踪程序运行状态 调试错误等 而Java日志信息就是这些输出信息的集合 那么为什么要抓取和收集Java日志信息呢 一方面 这些信息可以帮助我
  • 失业的程序员(八):创业的要素

    一 管饭哥登场 按理说我规定我和卞工的上班时间是上午8点到10点 弹性足够大 虽曰规定 但是遵不遵守随意 原因只有一个 引用卞工的话 就两个人 考毛勤 我 很是认可 严密的考勤制度的建立是老板对员工不怎么太信任的开始 是一种等级制度的体现
  • 1.神奇的字符串之快速求和

    文章目录 前言 正题 先看第一个代码 直接循环取出每一位数 总结 前言 这个专栏是分享一些好用的数据 和一些解题比较快的小方法 会持续更新 因为博主还是计算机方向的小白 知道的东西还是很少 希望大家可以多多指教 正题 众所周知 字符串一直是
  • PyTorch实现Logistic regression

    逻辑回归 Logistic regression 回归方法是对数值型连续随机变量进行预测和建模的监督学习算法 其特点是标注的数据集具有数值型的目标变量 回归的目的是预测数值型的目标值 逻辑回归对应线性回归 旨在解决分类问题 即将模型的输出转
  • python如何对微信应用进行监听

    要在 Python 中监听微信应用 需要使用微信提供的接口和相关的第三方库 具体实现方法如下 首先需要申请微信公众平台账号并获取相应的 AppID 和 AppSecret 使用第三方库 如 itchat 来进行接口调用 Itchat 是一个
  • Git提交error: RPC failed; result=22, HTTP code = 500的解决方法

    新建了一个项目使用sourcetree提交Git时 提示错误 RPC failed result 22 HTTP code 500 这是由于上传的包过大 HTTP的头错误导致的 解决办法 在终端执行命令显示隐藏文件夹 显示全部文件 defa
  • wget -o -O和-O-有什么区别?bash改色

    wget o O和 O 有什么区别 wget o 下载过程信息存入日志文件wget o youlogname log url 下载文件放另一边 wget O 以其他名称保存下载的文件内容 输出下载过程信息wget O home ym dem
  • linux之librdkafka库安装以及将#include <librdkafka/rdkafka.h>更改为#include <rdkafka.h>调用

    公众号 嵌入式不难 本文仅供参考学习 如有错误之处 欢迎留言指正 下载源代码 使用如下命令 git clone https github com edenhill librdkafka git 切换到发布的稳定分支 刚下载下来的源代码默认在