官网:https://libwebsockets.org/
GitHub源码:
git clone https://libwebsockets.org/repo/libwebsockets
交叉编译完成zlib(可能不需要)和openssl,目前我还是使用的openssl,虽然它的代码被很多人诟病,但是目前资料还是较多,暂时仍选用openssl。对于交叉编译zlib和openssl在其它的总结上有说明,这里不再细说。编译安装玩成后记得其目录,后面要用。
libwebsockets为了跨平台选择使用cmake生成makefile,所以最好先了解一下cmake,对于编译过libmysqlclient的人来说,cmake并不陌生。
解压完libwebsockets源码后,在其中创建mipsel文件夹,我们将安装交叉编译后的程序到该文件夹下。
git clone https://libwebsockets.org/repo/libwebsockets
cd libwebsockets
mkdir mipsel
cd mipsel
vim compile.sh
简单的编译脚本:
#########################################################################
# File Name: compile.sh
# Author: loon
# mail: [email protected]
# Created Time: 2018年09月06日 星期四 09时37分51秒
#########################################################################
#!/bin/bash
cd ..
cmake \
-DCMAKE_INSTALL_PREFIX=/home/ubuntu/work/libwebsockets/mipsel \
-DCMAKE_C_COMPILER=mipsel-openwrt-linux-gcc-4.8.3 \
-DCMAKE_CXX_COMPILER=mipsel-openwrt-linux-g++ \
-DLWS_OPENSSL_INCLUDE_DIRS=/usr/local/ssl-mipsel/include \
-DLWS_OPENSSL_LIBRARIES="/usr/local/ssl-mipsel/lib/libssl.so;/usr/local/ssl-mipsel/lib/libcrypto.so"
#-DZLIB_INCLUDE_DIR=/home/ubuntu/work/zlib-1.2.8/mipsel/include \
#-DZLIB_LIBRARY=/home/ubuntu/work/zlib-1.2.8/mipsel/lib \
make
make install
对于cmake的参数需要结合源码中的CMakeLists.txt和cmake的知识来确认,然后结合自己的交叉编译器即可。这其中由于库的不同版本肯定会遇到一些问题,这需要结合问题去解决,后面我将我遇到的一些问题进行了记录。
-- Build files have been written to: /home/ubuntu/work/libwebsockets
[ 1%] Building C object CMakeFiles/websockets.dir/lib/core/alloc.c.o
In file included from /home/ubuntu/work/libwebsockets/lib/core/private.h:134:0,
from /home/ubuntu/work/libwebsockets/lib/core/alloc.c:1:
/home/ubuntu/work/libwebsockets/include/libwebsockets.h:223:25: fatal error: openssl/ssl.h: No such file or directory
#include
^
compilation terminated.
CMakeFiles/websockets.dir/build.make:62: recipe for target 'CMakeFiles/websockets.dir/lib/core/alloc.c.o' failed
make[2]: *** [CMakeFiles/websockets.dir/lib/core/alloc.c.o] Error 1
CMakeFiles/Makefile2:141: recipe for target 'CMakeFiles/websockets.dir/all' failed
make[1]: *** [CMakeFiles/websockets.dir/all] Error 2
Makefile:149: recipe for target 'all' failed
make: *** [all] Error 2
[ 1%] Building C object CMakeFiles/websockets.dir/lib/core/alloc.c.o
In file included from /home/ubuntu/work/libwebsockets/lib/core/private.h:134:0,
from /home/ubuntu/work/libwebsockets/lib/core/alloc.c:1:
/home/ubuntu/work/libwebsockets/include/libwebsockets.h:223:25: fatal error: openssl/ssl.h: No such file or directory
#include
^
compilation terminated.
CMakeFiles/websockets.dir/build.make:62: recipe for target 'CMakeFiles/websockets.dir/lib/core/alloc.c.o' failed
make[2]: *** [CMakeFiles/websockets.dir/lib/core/alloc.c.o] Error 1
CMakeFiles/Makefile2:141: recipe for target 'CMakeFiles/websockets.dir/all' failed
make[1]: *** [CMakeFiles/websockets.dir/all] Error 2
Makefile:149: recipe for target 'all' failed
make: *** [all] Error 2
编译时遇到这种问题可以看到是没有找到相关的openssl的头文件,可能是没有正确指明头文件位置,或者cmake中的指定openssl头文件的指令有误。
[ 44%] Linking C executable bin/libwebsockets-test-fuzxy
lib/libwebsockets.a(ssl.c.o): In function `lws_ssl_get_error':
ssl.c:(.text+0x270): undefined reference to `SSL_get_error'
lib/libwebsockets.a(ssl.c.o): In function `lws_ssl_elaborate_error':
ssl.c:(.text+0x444): undefined reference to `ERR_error_string_n'
ssl.c:(.text+0x44c): undefined reference to `ERR_get_error'
lib/libwebsockets.a(ssl.c.o): In function `lws_ssl_bind_passphrase':
ssl.c:(.text+0x488): undefined reference to `SSL_CTX_set_default_passwd_cb_userdata'
ssl.c:(.text+0x4a4): undefined reference to `SSL_CTX_set_default_passwd_cb'
lib/libwebsockets.a(ssl.c.o): In function `lws_context_init_ssl_library':
ssl.c:(.text+0x4d8): undefined reference to `SSL_library_init'
ssl.c:(.text+0x4e0): undefined reference to `OPENSSL_add_all_algorithms_noconf'
ssl.c:(.text+0x4e8): undefined reference to `SSL_load_error_strings'
ssl.c:(.text+0x504): undefined reference to `SSL_get_ex_new_index'
ssl.c:(.text+0x524): undefined reference to `SSL_CTX_get_ex_new_index'
lib/libwebsockets.a(ssl.c.o): In function `lws_ssl_destroy':
ssl.c:(.text+0x574): undefined reference to `SSL_CTX_free'
ssl.c:(.text+0x5a0): undefined reference to `SSL_CTX_free'
ssl.c:(.text+0x5a8): undefined reference to `ERR_remove_thread_state'
ssl.c:(.text+0x5b0): undefined reference to `SSL_COMP_free_compression_methods'
ssl.c:(.text+0x5b8): undefined reference to `ERR_free_strings'
ssl.c:(.text+0x5c0): undefined reference to `EVP_cleanup'
ssl.c:(.text+0x5d0): undefined reference to `CRYPTO_cleanup_all_ex_data'
lib/libwebsockets.a(ssl.c.o): In function `lws_ssl_capable_read':
ssl.c:(.text+0x63c): undefined reference to `SSL_read'
ssl.c:(.text+0x6dc): undefined reference to `SSL_pending'
这种情况明显是没有找到链接库,我们结合config生成时的警告来进一步确定:
WARNING: Target "cmTC_2456e" requests linking to directory "/usr/local/ssl-mipsel/lib". Targets may link only to libraries. CMake is dropping the item.
-- Looking for SSL_CTX_set1_param - not found
-- Looking for SSL_set_info_callback
WARNING: Target "cmTC_b8022" requests linking to directory "/usr/local/ssl-mipsel/lib". Targets may link only to libraries. CMake is dropping the item.
-- Looking for SSL_set_info_callback - not found
-- Looking for X509_VERIFY_PARAM_set1_host
WARNING: Target "cmTC_7f323" requests linking to directory "/usr/local/ssl-mipsel/lib". Targets may link only to libraries. CMake is dropping the item.
-- Looking for X509_VERIFY_PARAM_set1_host - not found
-- Looking for RSA_set0_key
WARNING: Target "cmTC_92ac5" requests linking to directory "/usr/local/ssl-mipsel/lib". Targets may link only to libraries. CMake is dropping the item.
-- Looking for RSA_set0_key - not found
-- Looking for X509_get_key_usage
可能前面会有类似这样的警告产生,这是由于库文件仅仅指明路径还是不够的,还需要指明具体的库文件的名字,比如libssl.so等,需要指明具体的库的名字(这算是对cmake不熟悉造成的一个比较低级的错误)。
应该是:
-DLWS_OPENSSL_LIBRARIES="/usr/local/ssl-mipsel/lib/libssl.so;/usr/local/ssl-mipsel/lib/libcrypto.so"
而不是:
-DLWS_OPENSSL_LIBRARIES=/usr/local/ssl-mipsel/lib
-- Configuring incomplete, errors occurred!
See also "/home/ubuntu/work/libwebsockets/CMakeFiles/CMakeOutput.log".
See also "/home/ubuntu/work/libwebsockets/CMakeFiles/CMakeError.log".
CMake Error: Unable to open check cache file for write. /home/ubuntu/work/libwebsockets/CMakeFiles/cmake.check_cache
Makefile:1937: recipe for target 'cmake_check_build_system' failed
make: *** [cmake_check_build_system] Error 1
目前不是很清楚什么原因导致了cmake执行时出问题了,目前我的解决方法就是删除源码重新下载编译。
解决完所有问题后执行我们的脚本就会自动完成配置cmake、编译和安装过程。
...
[ 81%] Building C object CMakeFiles/websockets_shared.dir/lib/tls/openssl/openssl-client.c.o
[ 82%] Building C object CMakeFiles/websockets_shared.dir/lib/misc/sha-1.c.o
[ 83%] Building C object CMakeFiles/websockets_shared.dir/lib/plat/unix/unix-caps.c.o
[ 84%] Building C object CMakeFiles/websockets_shared.dir/lib/plat/unix/unix-fds.c.o
[ 85%] Building C object CMakeFiles/websockets_shared.dir/lib/plat/unix/unix-file.c.o
[ 86%] Building C object CMakeFiles/websockets_shared.dir/lib/plat/unix/unix-misc.c.o
[ 87%] Building C object CMakeFiles/websockets_shared.dir/lib/plat/unix/unix-init.c.o
[ 88%] Building C object CMakeFiles/websockets_shared.dir/lib/plat/unix/unix-pipe.c.o
[ 89%] Building C object CMakeFiles/websockets_shared.dir/lib/plat/unix/unix-service.c.o
[ 90%] Building C object CMakeFiles/websockets_shared.dir/lib/plat/unix/unix-sockets.c.o
[ 91%] Building C object CMakeFiles/websockets_shared.dir/lib/roles/http/server/server.c.o
[ 92%] Building C object CMakeFiles/websockets_shared.dir/lib/roles/http/server/lws-spa.c.o
[ 93%] Building C object CMakeFiles/websockets_shared.dir/lib/event-libs/poll/poll.c.o
[ 94%] Building C object CMakeFiles/websockets_shared.dir/lib/misc/lejp.c.o
[ 95%] Building C object CMakeFiles/websockets_shared.dir/lib/roles/http/server/lejp-conf.c.o
[ 96%] Linking C shared library lib/libwebsockets.so
/usr/local/ssl-mipsel/lib/libcrypto.so: warning: gethostbyname is obsolescent, use getnameinfo() instead.
[ 96%] Built target websockets_shared
Scanning dependencies of target test-server-extpoll
[ 97%] Building C object CMakeFiles/test-server-extpoll.dir/test-apps/test-server.c.o
[ 98%] Linking C executable bin/libwebsockets-test-server-extpoll
/usr/local/ssl-mipsel/lib/libcrypto.so: warning: gethostbyname is obsolescent, use getnameinfo() instead.
[ 98%] Built target test-server-extpoll
Scanning dependencies of target test-server
[ 99%] Building C object CMakeFiles/test-server.dir/test-apps/test-server.c.o
[100%] Linking C executable bin/libwebsockets-test-server
/usr/local/ssl-mipsel/lib/libcrypto.so: warning: gethostbyname is obsolescent, use getnameinfo() instead.
[100%] Built target test-server
Install the project...
-- Install configuration: "Release"
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/lib/pkgconfig/libwebsockets.pc
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/lib/pkgconfig/libwebsockets_static.pc
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-http.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-adopt.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-network-helper.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-stats.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-service.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-sha1-base64.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-ws-state.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-purify.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-esp32.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-write.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-ring.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-logs.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-vfs.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-context-vhost.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-jwk.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-cgi.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-lejp.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-jws.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-client.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-x509.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-spa.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-ws-ext.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-protocols-plugins.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-plugin-generic-sessions.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-timeout-timer.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-misc.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-genhash.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-writeable.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-ws-close.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-genrsa.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-callbacks.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets/lws-threadpool.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/lib/libwebsockets.a
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/lws_config.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/include/lws-plugin-ssh.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/lib/libwebsockets.so.13
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/lib/libwebsockets.so
-- Set runtime path of "/home/ubuntu/work/libwebsockets/mipsel/lib/libwebsockets.so.13" to ""
-- Up-to-date: /home/ubuntu/work/libwebsockets/mipsel/include/libwebsockets.h
-- Up-to-date: /home/ubuntu/work/libwebsockets/mipsel/include/lws_config.h
-- Up-to-date: /home/ubuntu/work/libwebsockets/mipsel/include/lws-plugin-ssh.h
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-server
-- Set runtime path of "/home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-server" to ""
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-fuzxy
-- Set runtime path of "/home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-fuzxy" to ""
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-server-extpoll
-- Set runtime path of "/home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-server-extpoll" to ""
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-lejp
-- Set runtime path of "/home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-lejp" to ""
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-client
-- Set runtime path of "/home/ubuntu/work/libwebsockets/mipsel/bin/libwebsockets-test-client" to ""
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/libwebsockets-test-server.key.pem
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/libwebsockets-test-server.pem
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/favicon.ico
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/leaf.jpg
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/candide.zip
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/libwebsockets.org-logo.png
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/http2.png
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/wss-over-h2.png
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/lws-common.js
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/test.html
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/test.css
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/test.js
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/private/index.html
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/lws-ssh-test-keys
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/share/libwebsockets-test-server/lws-ssh-test-keys.pub
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/lib/cmake/libwebsockets/LibwebsocketsConfig.cmake
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/lib/cmake/libwebsockets/LibwebsocketsConfigVersion.cmake
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/lib/cmake/libwebsockets/LibwebsocketsTargets.cmake
-- Installing: /home/ubuntu/work/libwebsockets/mipsel/lib/cmake/libwebsockets/LibwebsocketsTargets-release.cmake
这是根据我们配置安装后的mipsel目录下的文件目录树:
ubuntu@ubuntu-virtual-machine:~/work/libwebsockets/mipsel$ tree -a
.
├── bin
│ ├── libwebsockets-test-client
│ ├── libwebsockets-test-fuzxy
│ ├── libwebsockets-test-lejp
│ ├── libwebsockets-test-server
│ └── libwebsockets-test-server-extpoll
├── compile.sh
├── include
│ ├── libwebsockets
│ │ ├── lws-adopt.h
│ │ ├── lws-callbacks.h
│ │ ├── lws-cgi.h
│ │ ├── lws-client.h
│ │ ├── lws-context-vhost.h
│ │ ├── lws-esp32.h
│ │ ├── lws-genhash.h
│ │ ├── lws-genrsa.h
│ │ ├── lws-http.h
│ │ ├── lws-jwk.h
│ │ ├── lws-jws.h
│ │ ├── lws-lejp.h
│ │ ├── lws-logs.h
│ │ ├── lws-misc.h
│ │ ├── lws-network-helper.h
│ │ ├── lws-plugin-generic-sessions.h
│ │ ├── lws-protocols-plugins.h
│ │ ├── lws-purify.h
│ │ ├── lws-ring.h
│ │ ├── lws-service.h
│ │ ├── lws-sha1-base64.h
│ │ ├── lws-spa.h
│ │ ├── lws-stats.h
│ │ ├── lws-threadpool.h
│ │ ├── lws-timeout-timer.h
│ │ ├── lws-vfs.h
│ │ ├── lws-writeable.h
│ │ ├── lws-write.h
│ │ ├── lws-ws-close.h
│ │ ├── lws-ws-ext.h
│ │ ├── lws-ws-state.h
│ │ └── lws-x509.h
│ ├── libwebsockets.h
│ ├── lws_config.h
│ └── lws-plugin-ssh.h
├── lib
│ ├── cmake
│ │ └── libwebsockets
│ │ ├── LibwebsocketsConfig.cmake
│ │ ├── LibwebsocketsConfigVersion.cmake
│ │ ├── LibwebsocketsTargets.cmake
│ │ └── LibwebsocketsTargets-release.cmake
│ ├── libwebsockets.a
│ ├── libwebsockets.so -> libwebsockets.so.13
│ ├── libwebsockets.so.13
│ └── pkgconfig
│ ├── libwebsockets.pc
│ └── libwebsockets_static.pc
└── share
└── libwebsockets-test-server
├── candide.zip
├── favicon.ico
├── http2.png
├── leaf.jpg
├── libwebsockets.org-logo.png
├── libwebsockets-test-server.key.pem
├── libwebsockets-test-server.pem
├── lws-common.js
├── lws-ssh-test-keys
├── lws-ssh-test-keys.pub
├── private
│ └── index.html
├── test.css
├── test.html
├── test.js
└── wss-over-h2.png
10 directories, 65 files
将除过编译文件的内容拷贝到网关中,我们就可以利用bin目录下的测试服务程序等先测试一下编译后的libwebsockets是否可以在我们的开发板上运行,测试通过则说明我们也可以利用该库开发我们的wss程序。