交叉编译ARM架构libssh时链接libcrypto文件格式不兼容求助
解决交叉编译ARM架构libssh时链接x86 libcrypto的错误
你的判断没错——编译时确实调用了主机x86_64系统默认路径下的libcrypto.so,这个库的架构和你要编译的ARM目标不匹配,导致链接失败。根源在于libssh依赖OpenSSL,但你没有指定交叉编译环境下的ARM版OpenSSL,CMake自动搜索到了主机系统的库。
解决步骤:
先交叉编译ARM版OpenSSL
首先需要为你的ARM架构编译对应版本的OpenSSL,作为libssh的依赖:- 下载对应版本的OpenSSL源码(建议和libssh要求的版本匹配)
- 进入源码目录,执行交叉编译配置:
注意:./Configure linux-armv7 --prefix=/home/zen/Downloads/armv7-marvell-linux-gnueabi/openssl --cross-compile-prefix=arm-marvell-linux-gnueabi-linux-armv7需匹配你的ARM架构,若不确定可查看OpenSSL的Configure --help获取对应选项;--prefix指定安装路径,要和你的交叉编译工具链目录保持统一方便管理。 - 编译并安装:
make make install
修改libssh的CMake配置,指定ARM版OpenSSL路径
在你原来的CMake命令基础上,添加OpenSSL相关参数,强制CMake使用交叉编译好的ARM版库:cmake .. -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_INSTALL_PREFIX=/home/zen/Downloads/armv7-marvell-linux-gnueabi \ -DCMAKE_C_COMPILER=/home/zen/Downloads/armv7-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-gcc \ -DCMAKE_CXX_COMPILER=/home/zen/Downloads/armv7-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-g++ \ -DWITH_ZLIB=OFF \ -DOPENSSL_ROOT_DIR=/home/zen/Downloads/armv7-marvell-linux-gnueabi/openssl \ -DOPENSSL_INCLUDE_DIR=/home/zen/Downloads/armv7-marvell-linux-gnueabi/openssl/include \ -DOPENSSL_CRYPTO_LIBRARY=/home/zen/Downloads/armv7-marvell-linux-gnueabi/openssl/lib/libcrypto.so所有路径需和你安装OpenSSL时的
--prefix完全对应。清理CMake缓存(必要时)
如果之前已经运行过CMake配置,先删除build目录下的CMakeCache.txt,或者直接删除整个build目录重新执行上述CMake命令,避免旧缓存干扰新配置。
内容的提问来源于stack exchange,提问作者Rishi Kaimal
相关产品推荐
相关产品推荐

