使用交叉编译器编译ARM Cortex-M4架构的libwebsockets时出现了CMake错误

3
让我开头说明一下这个问题:今天我花了几个小时研究这个问题,在stackoverflow上有很多相关信息。我感觉离成功已经很接近了,但总有些问题无法解决。如果我没有尽可能利用谷歌的话,我也不会来问这个问题。我对我的目标非常了解,并且已经成功地交叉编译了许多开源软件包,但是由于libwebsockets使用了我不熟悉的cmake,所以这些错误对我来说相当陌生;我想我可以查阅一下cmake文档,但是我怀疑我不能在规定的时间内找到答案。
我正在尝试为ARM-Cortex-M4平台交叉编译libwebsockets。我遵循了libwebsockets文档的说明: 1)在libwebsockets源码目录上面创建一个“build”目录。 2)在build目录中调用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=1make VERBOSE=1。它将提供比传统且几乎无用的 Cmake 输出更多的信息。 - jww
你可能还想在Cortex-M4中的CFLAGSCXXFLAGS中包含-mthumb -mcpu=cortex-m4。如果有软浮点单元,可能还需要包含-mfloat-abi=softfp -mfpu=fpv4-sp-d16,如果有硬浮点单元,则需要包含-mfloat-abi=hard -mfpu=fpv4-sp-d16。另请参见cmake CFLAGS CXXFLAGS modification - jww
只需使用 message() 函数输出变量来调试 /usr/share/cmake-3.5/Modules/FindOpenSSL.cmake - Velkan
1个回答

1
我遇到了同样的问题。在我的 toolchain.cmake 文件中设置以下变量就解决了问题:
SET(ZLIB_INCLUDE_DIR ../../../build/buildroot-build/staging/usr/include)
SET(ZLIB_LIBRARY ../../../build/buildroot-build/target/usr/lib/libz.so)

SET(OPENSSL_ROOT_DIR ../../../build/buildroot-build/target/usr)
SET(OPENSSL_LIBRARIES ../../../build/buildroot-build/target/usr/lib)
SET(OPENSSL_INCLUDE_DIR ../../../build/buildroot-build/staging/usr/include/openssl)
SET(OPENSSL_CRYPTO_LIBRARY ../../../build/buildroot-build/target/usr/lib/libcrypto.so)
SET(OPENSSL_SSL_LIBRARY ../../../build/buildroot-build/target/usr/lib/libssl.so)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接