【发布时间】:2016-07-20 02:38:41
【问题描述】:
让我先介绍这个问题:我今天花了几个小时研究这个问题,在 stackoverflow 上有很多点击。我觉得我很接近,但总有一些东西在路上。我不会问我是否觉得我已经用尽了谷歌提供的东西。我非常了解我的目标并成功交叉编译了许多开源包,但是,鉴于 libwebsockets 使用我不熟悉的 cmake,这些错误对我来说很陌生;我想我可以翻阅 cmake 文档,但我怀疑我会在我拥有的时间范围内找到答案。
我正在尝试为 ARM-Cortex-M4 平台交叉编译 libwebsockets。我已按照 libwebsockets 文档中的说明进行操作: 1)在libwebsockets源目录上方创建一个“build”目录。 2) 在构建目录中,调用 cmake:
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cross.cmake
3) 我使用他们的 ARM 模板来创建 cross.cmake
#
# CMake Toolchain file for crosscompiling on ARM.
#
# This can be used when running cmake in the following way:
# cd build/
# cmake .. -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake
#
# Name of C compiler.
SET(CMAKE_C_COMPILER "arm-uclinuxeabi-gcc")
SET(CMAKE_CXX_COMPILER "arm-uclinuxeabi-g++")
# this one is important
SET(CMAKE_SYSTEM_NAME Linux)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
SET(BUILD_SHARED_LIBS OFF)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH ../../../../A2F ../../../../tools ../../../xv-nic)
SET(ZLIB_INCLUDE_DIR "../lzo-2.09/")
SET(ZLIB_LIBRARY "../../lib/libz.a")
SET(OPENSSL_ROOT_DIR "../../ssl")
SET(OPENSSL_LIBRARIES "../../ssl/usr/local/ssl/lib/")
SET(OPENSSL_INCLUDE_DIR "../../ssl/usr/local/ssl/include/openssl/")
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
4) 此投诉失败
Compiling with SSL support
CMake Error at /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
system variable OPENSSL_ROOT_DIR (missing: **OPENSSL_LIBRARIES**)
Call Stack (most recent call first):
/usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-3.5/Modules/FindOpenSSL.cmake:370 (find_package_handle_standard_args)
CMakeLists.txt:816 (find_package)
现在,奇怪/令人沮丧的是,我确实在我声称的地方安装了 openssl;此外,如果我删除
SET(ZLIB_INCLUDE_DIR "../lzo-2.09/")
,我收到了类似于图书馆投诉的投诉。此外,cmake 似乎找到了以类似方式存在的 zlib。我已经用这个 ssl 设置编译了其他几个应用程序,但我对 cmake 不熟悉。
我已尝试尽可能详细地写出一篇文章,但不会写出太长而无法阅读的帖子,所以如果我遗漏了一些内容,如果有人已经解决了这个问题,我很乐意提供更多细节。提前致谢!
【问题讨论】:
-
从
SET(OPENSSL_INCLUDE_DIR "../../ssl/usr/local/ssl/include/openssl/")中删除尾随的openssl。源文件将#include <openssl/header.h>,并将其组合为.../ssl/usr/local/ssl/include/openssl/openssl/header.h的标头路径。您也可以尝试使用make V=1或make VERBOSE=1。它将为您提供比传统且几乎无用的 Cmake 输出更多的信息。 -
您可能还希望在 Cortex-M4 的
CFLAGS和CXXFLAGS中包含-mthumb -mcpu=cortex-m4。如果有软浮点单元,可能-mfloat-abi=softfp -mfpu=fpv4-sp-d16和硬浮点单元-mfloat-abi=hard -mfpu=fpv4-sp-d16。另请参阅cmake CFLAGS CXXFLAGS modification。 -
使用
message()函数调试/usr/share/cmake-3.5/Modules/FindOpenSSL.cmake即可输出变量。