【问题标题】:How to build Paho MQTT C static libraries on a Raspberry Pi?如何在 Raspberry Pi 上构建 Paho MQTT C 静态库?
【发布时间】:2023-04-29 08:47:01
【问题描述】:

我正在尝试在 Raspberry Pi 3 B+ 上构建 Eclipse Paho MQTT C 的静态库。作为先决条件,系统上必须有静态版本的 OpenSSL 库。

首先,我尝试使用以下命令获取它:

git clone git://git.openssl.org/openssl.git
cd openssl
git checkout OpenSSL_1_1_1a
./config -static
sudo make install

这确实会在/usr/local/lib 中生成一个libssl.a 文件。但是,当我尝试使用以下命令构建 Paho 的静态库时,它会失败并出现以下错误:

git clone https://github.com/eclipse/paho.mqtt.c.git
mkdir /tmp/build.paho
cd /tmp/build.paho
cmake -GNinja -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_STATIC=TRUE ~/paho.mqtt.c
ninja

/usr/bin/ld: /usr/local/lib/libssl.a(methods.o): relocation R_ARM_MOVW_ABS_NC against ‘a local symbol’ can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libssl.a: error adding symbols: Bad value

在几个 * 问题中建议的解决方案似乎是使用 shared 标志构建静态 OpenSSL 库:./config shared -static 但即便如此,静态 Paho 库的构建也会失败,并出现完全相同的错误。

我应该补充一点,我在其他硬件架构上使用此过程没有任何问题。这个问题是否与 Raspberry Pi 有任何关系?我该如何解决?

【问题讨论】:

  • 请不要发布带有错误消息的图片。相反,将错误消息发布为 text。除其他原因外,这是 Stack Overflow 的规则。见How to Ask
  • 抱歉,错误添加为文本。
  • 关于recompile with -fPIC的“标准”问题。您需要使用该选项编译 OpenSSL。参见例如this answer 关于这样做的可能方式。
  • 您是否尝试在您的cmake 命令中添加另一个定义-DCMAKE_POSITION_INDEPENDENT_CODE=ON 以启用所有目标的PIC? (建议here

标签: cmake openssl static-libraries paho ninja


【解决方案1】:

CFLAGS=-fPIC ./config shared -static 似乎适用于 OpenSSL。但是,在构建静态 Paho MQTT C 库后,没有任何错误完成,在任何地方都找不到静态库。

如果我再查看/usr/local/lib,我只会在那里找到动态 .o 库,没有静态 .a 库。为什么这在 Pi 上不起作用,但在不同的系统上却完全正常?

【讨论】: