Paho C(ARM)的交叉编译问题
Posted
技术标签:
【中文标题】Paho C(ARM)的交叉编译问题【英文标题】:Problem with cross compilation of Paho C (ARM) 【发布时间】:2021-07-26 19:50:40 【问题描述】:我需要帮助,因为我尝试在 c 中为我的 arm 设备交叉编译 paho 库。
我使用的是 ubuntu 20.04 虚拟机,我的交叉编译器是 gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf_5.3_sub1.0.3.tgz。这里是不同的步骤。
git clone https://github.com/eclipse/paho.mqtt.c.git
sudo apt-get update
sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui
sudo apt-get install fakeroot fakeroot devscripts dh-make lsb-release
sudo apt-get install libssl-dev
sudo apt-get install doxygen graphviz
mkdir build.paho
cd build.paho
我在 paho 项目的 cmake 文件夹中创建了一个文件“linaro.cmake”
# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++)
SET(CMAKE_STRIP /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-strip)
#SET(OPENSSL_LIB_SEARCH_PATH opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib)
#SET(OPENSSL_INC_SEARCH_PATH opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/openssl)
#SET(OPENSSL_SEARCH_PATH "/opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib;/opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/bin/")
SET(OPENSSL_ROOT_DIR /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/bin)
SET(OPENSSL_LIBRARIES /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib)
#SET(OPENSSL_LIBRARIES /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/openssl)
SET(OPENSSL_INCLUDE_DIR /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/openssl)
SET(OPENSSL_CRYPTO_LIBRARY /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/openssl/libcrypto.so)
SET(OPENSSL_SSL_LIBRARY /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/libssl.so)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_SYSTEM_VERSION 1)
我的问题,当我启动命令时
cmake \
-GNinja \
-DPAHO_WITH_SSL=TRUE \
-DPAHO_BUILD_SAMPLES=TRUE \
-DPAHO_BUILD_DOCUMENTATION=TRUE \
-DCMAKE_TOOLCHAIN_FILE=../cmake/linaro.cmake ..
我有多个警告,例如
-- C 编译器标识为 GNU 5.3.1 -- 检查工作的 C 编译器:/opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -- 检查工作的 C 编译器:/opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -- 工作 -- 检测 C 编译器 ABI 信息 -- 检测 C 编译器 ABI 信息 - 完成 -- 检测 C 编译特性 -- 检测 C 编译特性 - 完成 -- CMake 版本:3.16.3 -- CMake 系统名称:Linux -- 时间戳为 2021-05-04T12:39:01Z -- 找到 OpenSSL:/opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/bin/libcrypto.so
-- 在 src/CMakeLists.txt:200 (ADD_LIBRARY) 处配置完成的 CMake 警告 (dev):未设置策略 CMP0028:目标中的双冒号 名称表示 ALIAS 或 IMPORTED 目标。运行“cmake --help-policy CMP0028”获取策略详细信息。使用 cmake_policy 命令设置 政策并禁止显示此警告。
目标“paho-mqtt3cs”链接到目标“OpenSSL::Crypto”,但 未找到目标。可能缺少 find_package() 调用 IMPORTED 目标,还是缺少 ALIAS 目标?这个警告是 对于项目开发人员。使用 -Wno-dev 来抑制它。
src/CMakeLists.txt:201 (ADD_LIBRARY) 处的 CMake 警告 (dev):策略 未设置 CMP0028:目标名称中的双冒号表示 ALIAS 或 导入的目标。为策略运行“cmake --help-policy CMP0028” 细节。使用 cmake_policy 命令设置策略并抑制 这个警告。
目标“paho-mqtt3as”链接到目标“OpenSSL::Crypto”,但 未找到目标。可能缺少 find_package() 调用 IMPORTED 目标,还是缺少 ALIAS 目标?这个警告是 对于项目开发人员。使用 -Wno-dev 来抑制它。
src/CMakeLists.txt:332 (ADD_EXECUTABLE) 处的 CMake 警告 (dev): 未设置策略 CMP0028:目标名称中的双冒号表示 ALIAS 或 导入的目标。为策略运行“cmake --help-policy CMP0028” 细节。使用 cmake_policy 命令设置策略并抑制 这个警告。
目标“Sha1TestOpenSSL”链接到目标“OpenSSL::Crypto”,但 未找到目标。可能缺少 find_package() 调用 IMPORTED 目标,还是缺少 ALIAS 目标?这个警告是 对于项目开发人员。使用 -Wno-dev 来抑制它。
src/CMakeLists.txt:323 (ADD_EXECUTABLE) 处的 CMake 警告 (dev): 未设置策略 CMP0028:目标名称中的双冒号表示 ALIAS 或 导入的目标。为策略运行“cmake --help-policy CMP0028” 细节。使用 cmake_policy 命令设置策略并抑制 这个警告。
目标“Base64TestOpenSSL”链接到目标“OpenSSL::Crypto”,但 未找到目标。可能缺少 find_package() 调用 IMPORTED 目标,还是缺少 ALIAS 目标?这个警告是 对于项目开发人员。使用 -Wno-dev 来抑制它。
测试/CMakeLists.txt:516 (ADD_EXECUTABLE) 处的 CMake 警告(开发): 未设置策略 CMP0028:目标名称中的双冒号表示 ALIAS 或 导入的目标。为策略运行“cmake --help-policy CMP0028” 细节。使用 cmake_policy 命令设置策略并抑制 这个警告。
目标“test3”链接到目标“OpenSSL::Crypto”,但目标是 未找到。 IMPORTED 可能缺少 find_package() 调用 目标,还是缺少 ALIAS 目标?此警告适用于项目 开发商。使用 -Wno-dev 来抑制它。
测试/CMakeLists.txt:1122 (ADD_EXECUTABLE) 处的 CMake 警告(开发): 未设置策略 CMP0028:目标名称中的双冒号表示 ALIAS 或 导入的目标。为策略运行“cmake --help-policy CMP0028” 细节。使用 cmake_policy 命令设置策略并抑制 这个警告。
目标“test5”链接到目标“OpenSSL::Crypto”,但目标是 未找到。 IMPORTED 可能缺少 find_package() 调用 目标,还是缺少 ALIAS 目标?此警告适用于项目 开发商。使用 -Wno-dev 来抑制它。
-- 生成完成 -- 构建文件已写入:/home/myhome/Documents/paho.mqtt.c/build.paho
当我尝试启动忍者包时
[9/50] 链接 C 共享库 src/libpaho-mqtt3cs.so.1.3.8 失败: src/libpaho-mqtt3cs.so.1.3.8:&& /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -fPIC -Wl,-init,MQTTClient_init -shared -Wl,-soname,libpaho-mqtt3cs.so.1 -o src/libpaho-mqtt3cs.so.1.3.8 src/CMakeFiles/common_ssl_obj.dir/MQTTTime.c.o src/CMakeFiles/common_ssl_obj.dir/MQTTProtocolClient.c.o src/CMakeFiles/common_ssl_obj.dir/Clients.c.o src/CMakeFiles/common_ssl_obj.dir/utf-8.c.o src/CMakeFiles/common_ssl_obj.dir/MQTTPacket.c.o src/CMakeFiles/common_ssl_obj.dir/MQTTPacketOut.c.o src/CMakeFiles/common_ssl_obj.dir/Messages.c.o src/CMakeFiles/common_ssl_obj.dir/Tree.c.o src/CMakeFiles/common_ssl_obj.dir/Socket.c.o src/CMakeFiles/common_ssl_obj.dir/Log.c.o src/CMakeFiles/common_ssl_obj.dir/MQTTPersistence.c.o src/CMakeFiles/common_ssl_obj.dir/Thread.c.o src/CMakeFiles/common_ssl_obj.dir/MQTTProtocolOut.c.o src/CMakeFiles/common_ssl_obj.dir/MQTTPersistenceDefault.c.o src/CMakeFiles/common_ssl_obj.dir/SocketBuffer.c.o src/CMakeFiles/common_ssl_obj.dir/LinkedList.c.o src/CMakeFiles/common_ssl_obj.dir/MQTTProperties.c.o src/CMakeFiles/common_ssl_obj.dir/MQTTReasonCodes.c.o src/CMakeFiles/common_ssl_obj.dir/Base64.c.o src/CMakeFiles/common_ssl_obj.dir/SHA1.c.o src/CMakeFiles/common_ssl_obj.dir/WebSocket.c.o src/CMakeFiles/common_ssl_obj.dir/StackTrace.c.o src/CMakeFiles/common_ssl_obj.dir/Heap.c.o src/CMakeFiles/paho-mqtt3cs.dir/MQTTClient.c.o src/CMakeFiles/paho-mqtt3cs.dir/SSLSocket.c.o /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/libssl.so -lOpenSSL::Crypto -lc -ldl -lpthread -lrt && : /opt/ gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/5.3.1/../../../../arm-linux-gnueabihf /bin/ld: ne peut trouver -lOpenSSL::Crypto collect2: error: ld returned 1 exit 状态 [11/50] 构建 C 对象 src/CMakeFiles/paho-mqtt3as.dir/SSLSocket.c.o ninja:构建停止: 子命令失败。
有人有想法吗?
对我来说奇怪的是这条线 -- 找到 OpenSSL:/opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/bin/libcrypto.so,即使我指出了另一个位置。
提前致谢
【问题讨论】:
您是否考虑过从 GCC 的源代码重新编译更新的 GCC 交叉编译器? 谢谢,我已经使用 linaro 编译器进行了测试,因为这是我的产品提供商的要求。他们推出了一个新固件,我用最近的 GCC 编译器测试它没问题(gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf)。我只需要升级我所有的设备 然后通过电子邮件与您的产品提供商讨论。如果他们提供了一些 C++ 代码,并且许可证允许您重新编译该 C++ 代码,您可以使用更新的 GCC 编译器。 顺便说一句,当前的 GCC 是 GCC 11 于 2021 年 4 月底发布。为什么不能使用它? 我的硬件供应商 ((owasys.com/en/products/owa450) 有一个基于 Debian 10.6 的主 FS - 基于 Linux 内核 4.19.94 的内核 - 基于 gcc8.3 的交叉编译器。他使用自己的库交付他的硬件(GPS / GSM / IO / ...)所以当我在我的软件中使用他的库时,我必须使用相同的编译工具包 【参考方案1】:使用新的编译器 gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf 解决。
【讨论】:
以上是关于Paho C(ARM)的交叉编译问题的主要内容,如果未能解决你的问题,请参考以下文章