首页 > 解决方案 > Paho C(ARM)的交叉编译问题

问题描述

我需要帮助,因为我尝试在 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 信息 - 完成 -- Detecting C compile features -- Detecting C compile features - done -- CMake version: 3.16.3 -- CMake system name: Linux -- Timestamp is 2021-05-04T12:39:01Z -- Found 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”,但未找到目标。也许 IMPORTED 目标缺少 find_package() 调用,或者缺少 ALIAS 目标?此警告适用于项目开发人员。使用 -Wno-dev 来抑制它。

src/CMakeLists.txt:201 (ADD_LIBRARY) 处的 CMake 警告 (dev):未设置策略 CMP0028:目标名称中的双冒号表示 ALIAS 或
IMPORTED 目标。运行“cmake --help-policy CMP0028”以获取策略详细信息。使用 cmake_policy 命令设置策略并禁止显示此警告。

目标“paho-mqtt3as”链接到目标“OpenSSL::Crypto”,但未找到目标。也许 IMPORTED 目标缺少 find_package() 调用,或者缺少 ALIAS 目标?此警告适用于项目开发人员。使用 -Wno-dev 来抑制它。

src/CMakeLists.txt:332 (ADD_EXECUTABLE) 处的 CMake 警告 (dev):
未设置策略 CMP0028:目标名称中的双冒号表示 ALIAS 或 IMPORTED 目标。运行“cmake --help-policy CMP0028”以获取策略详细信息。使用 cmake_policy 命令设置策略并禁止显示此警告。

目标“Sha1TestOpenSSL”链接到目标“OpenSSL::Crypto”,但未找到目标。也许 IMPORTED 目标缺少 find_package() 调用,或者缺少 ALIAS 目标?此警告适用于项目开发人员。使用 -Wno-dev 来抑制它。

src/CMakeLists.txt:323 (ADD_EXECUTABLE) 处的 CMake 警告 (dev):
未设置策略 CMP0028:目标名称中的双冒号表示 ALIAS 或 IMPORTED 目标。运行“cmake --help-policy CMP0028”以获取策略详细信息。使用 cmake_policy 命令设置策略并禁止显示此警告。

目标“Base64TestOpenSSL”链接到目标“OpenSSL::Crypto”,但未找到目标。也许 IMPORTED 目标缺少 find_package() 调用,或者缺少 ALIAS 目标?此警告适用于项目开发人员。使用 -Wno-dev 来抑制它。

test/CMakeLists.txt:516 (ADD_EXECUTABLE) 处的 CMake 警告 (dev):
未设置策略 CMP0028:目标名称中的双冒号表示 ALIAS 或 IMPORTED 目标。运行“cmake --help-policy CMP0028”以获取策略详细信息。使用 cmake_policy 命令设置策略并禁止显示此警告。

目标“test3”链接到目标“OpenSSL::Crypto”,但未找到目标。也许 IMPORTED 目标缺少 find_package() 调用,或者缺少 ALIAS 目标?此警告适用于项目开发人员。使用 -Wno-dev 来抑制它。

test/CMakeLists.txt:1122 (ADD_EXECUTABLE) 处的 CMake 警告 (dev):
未设置策略 CMP0028:目标名称中的双冒号表示 ALIAS 或 IMPORTED 目标。运行“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.co src/CMakeFiles/common_ssl_obj.dir/MQTTProtocolClient.co src/CMakeFiles/common_ssl_obj.dir/Clients.co src/CMakeFiles/common_ssl_obj.dir/utf-8.co src/CMakeFiles/common_ssl_obj。 dir/MQTTPacket.co src/CMakeFiles/common_ssl_obj.dir/MQTTPacketOut.co src/CMakeFiles/common_ssl_obj.dir/Messages.co src/CMakeFiles/common_ssl_obj.dir/Tree.co src/CMakeFiles/common_ssl_obj.dir/Socket.co src /CMakeFiles/common_ssl_obj.dir/Log.co src/CMakeFiles/common_ssl_obj.dir/MQTTPersistence.co src/CMakeFiles/common_ssl_obj。dir/Thread.co src/CMakeFiles/common_ssl_obj.dir/MQTTProtocolOut.co src/CMakeFiles/common_ssl_obj.dir/MQTTPersistenceDefault.co src/CMakeFiles/common_ssl_obj.dir/SocketBuffer.co src/CMakeFiles/common_ssl_obj.dir/LinkedList.co src /CMakeFiles/common_ssl_obj.dir/MQTTProperties.co src/CMakeFiles/common_ssl_obj.dir/MQTTReasonCodes.co src/CMakeFiles/common_ssl_obj.dir/Base64.co src/CMakeFiles/common_ssl_obj.dir/SHA1.co src/CMakeFiles/common_ssl_obj.dir /WebSocket.co src/CMakeFiles/common_ssl_obj.dir/StackTrace.co src/CMakeFiles/common_ssl_obj.dir/Heap.co src/CMakeFiles/paho-mqtt3cs.dir/MQTTClient.co src/CMakeFiles/paho-mqtt3cs.dir/SSLSocket .co /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 && : /选择/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:无peut trouver -lOpenSSL::Crypto collect2:错误:ld 返回 1 退出状态 [11/50] 构建 C 对象 src/CMakeFiles/paho-mqtt3as.dir/SSLSocket.co ninja:构建停止:子命令失败。

有人有想法吗?

对我来说奇怪的是这一行 - Found OpenSSL: /opt/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/bin/libcrypto.so 即使我指出另一个地点。

提前致谢

标签: c++linuxgcccmakearm

解决方案


使用新的编译器 gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf 解决。


推荐阅读