编译 wolfssl 库
wolfssl github: https://github.com/wolfSSL/wolfssl
- 编译 .lib 或者 .dll
wolfssl 很好的提供了 win32 的工程=》sln 文件
这样就不用折腾 CMakeLists 文件了,使用 Visual Studio 打开 sln 文件后,设置好 Static 编译库即可,开箱即用
- 编译 .a 文件
如果需要编译 .a 库,可以借助 MINGW64 终端
因为 wolfssl 已经提供了 CMakeLists.txt,所以编译起来还是省事不少
在 MINGW64 终端中 cd 到 wolfssl/src,执行以下命令行:
cmake -S . -B build -G Ninja -DCMAKE_FLAGS="-DWOLFSSL_CRYPT_ONLY:BOOL=ON -DWOLFSSL_CRYPT_TESTS:BOOL=OFF -DWOLFSSL_DSA:BOOL=ON -DWOLFSSL_ECC:BOOL=OFF -DWOLFSSL_RSA:BOOL=OFF -DWOLFSSL_FILESYSTEM:BOOL=OFF -DWOLFSSL_ASYNC_THREADS:BOOL=OFF -DWOLFSSL_OLD_NAMES:BOOL=OFF -DBUILD_SHARED_LIBS:BOOL=OFF"
接着 ninja,可能会提示缺少 <stdint.h>
可以在源码中添加以下代码,
1 2 3 | #if defined(__MINGW64__) #include <stdint.h> #endif |
这样重新编译后就成功了
不过这样编译出的库名字有点奇葩,会编译出 libwolfssl.dll.a 的库
故可以采用 sh 脚本方法一步到位,也不会报缺少头文件的错误
build_mingw64.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/bin/bash set -e CMAKE_FLAGS= "-DWOLFSSL_CRYPT_ONLY:BOOL=ON -DWOLFSSL_CRYPT_TESTS:BOOL=OFF -DWOLFSSL_DSA:BOOL=ON -DWOLFSSL_ECC:BOOL=OFF -DWOLFSSL_RSA:BOOL=OFF -DWOLFSSL_FILESYSTEM:BOOL=OFF -DWOLFSSL_ASYNC_THREADS:BOOL=OFF -DWOLFSSL_OLD_NAMES:BOOL=OFF -DBUILD_SHARED_LIBS:BOOL=OFF" mkdir -p package/ming64/include mkdir -p package/ming64/lib rm -rf build cmake -S . -B build -G Ninja $CMAKE_FLAGS cd build ninja cp -r wolfssl ../package/ming64/include/ cp -r libwolfssl.a ../package/ming64/lib/ cd .. rm -rf build |
另附鸿蒙库的编译脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/bin/bash set -e NDK_PATH=~/Library/OpenHarmony/sdk/native/4.0 CMAKE=~/Library/OpenHarmony/sdk/native/4.0/build-tools/cmake/bin/cmake CMAKE_FLAGS="-DWOLFSSL_CRYPT_ONLY:BOOL=ON -DWOLFSSL_CRYPT_TESTS:BOOL=OFF -DWOLFSSL_DSA:BOOL=ON \ -DWOLFSSL_ECC:BOOL=OFF -DWOLFSSL_RSA:BOOL=OFF -DWOLFSSL_FILESYSTEM:BOOL=OFF \ -DWOLFSSL_ASYNC_THREADS:BOOL=OFF -DWOLFSSL_OLD_NAMES:BOOL=OFF -DBUILD_SHARED_LIBS:BOOL=OFF" arch=arm64-v8a rm -rf build $CMAKE -B build -G Ninja -DOHOS_STL=none -DOHOS_PLATFORM=OHOS \ -DCMAKE_TOOLCHAIN_FILE= "${NDK_PATH}/build/cmake/ohos.toolchain.cmake" \ -DCMAKE_C_FLAGS= "-Qunused-arguments" $CMAKE_FLAGS -DOHOS_ARCH=$arch cd build ninja mkdir -p ../package/ohos/include/$arch cp -r wolfssl ../package/ohos/include/$arch/ mkdir -p ../package/ohos/lib/$arch mv libwolfssl.a ../package/ohos/lib/$arch/ cd .. |
更新:Windows 建议也使用脚本来创建工程
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash set -e CMAKE_FLAGS= "-DWOLFSSL_CRYPT_ONLY:BOOL=ON -DWOLFSSL_CRYPT_TESTS:BOOL=OFF -DWOLFSSL_DSA:BOOL=ON -DWOLFSSL_ECC:BOOL=OFF -DWOLFSSL_RSA:BOOL=OFF -DWOLFSSL_FILESYSTEM:BOOL=OFF -DWOLFSSL_ASYNC_THREADS:BOOL=OFF -DWOLFSSL_OLD_NAMES:BOOL=OFF -DBUILD_SHARED_LIBS:BOOL=OFF" mkdir -p package/win32/include mkdir -p package/win32/lib rm -rf build cmake -S . -B build $CMAKE_FLAGS |
配置完后打开 .sln 工程,需要设置 Runtime Library 为 /MT 模式,此处默认为 Release 下编译,否则会出现符号文件找不到的问题
1 2 3 | wolfssl.lib(asn.obj) : error LNK2001: unresolved external symbol __imp__gmtime64 wolfssl.lib(wc_port.obj) : error LNK2001: unresolved external symbol __imp__beginthread wolfssl.lib(wc_port.obj) : error LNK2001: unresolved external symbol __imp__beginthreadex |
另注意在引用 sp_int.h 文件时可能会出现 syntax error: identifier '__attribute__' 错误,项目中并没有定义 HAVE___UINT128_T,不知道为何会编译到 __attribute__
1 2 3 4 5 6 7 8 | D:\wolfssl\src\wolfssl/wolfcrypt/sp_int.h(264,44): error C2061: syntax error: identifier '__attribute__' D:\wolfssl\src\wolfssl/wolfcrypt/sp_int.h(264,44): error C2059: syntax error: ';' D:\wolfssl\src\wolfssl/wolfcrypt/sp_int.h(265,44): error C2061: syntax error: identifier '__attribute__' D:\wolfssl\src\wolfssl/wolfcrypt/sp_int.h(265,44): error C2059: syntax error: ';' D:\wolfssl\src\wolfssl/wolfcrypt/sp_int.h(272,46): error C2061: syntax error: identifier '__attribute__' D:\wolfssl\src\wolfssl/wolfcrypt/sp_int.h(272,46): error C2059: syntax error: ';' D:\wolfssl\src\wolfssl/wolfcrypt/sp_int.h(273,46): error C2061: syntax error: identifier '__attribute__' D:\wolfssl\src\wolfssl/wolfcrypt/sp_int.h(273,46): error C2059: syntax error: ';' |
故临时的解决方法是注释 sp_int.h 中此处的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* Number of bytes in each word. */ #define SP_WORD_SIZEOF (SP_WORD_SIZE / 8) /* Define the types used. */ //#ifdef HAVE___UINT128_T // #ifdef __SIZEOF_INT128__ // typedef __uint128_t sp_uint128; // typedef __int128_t sp_int128; // #else // typedef unsigned long sp_uint128 __attribute__ ((mode(TI))); // typedef long sp_int128 __attribute__ ((mode(TI))); // #endif // #ifndef WOLFSSL_UINT128_T_DEFINED // #ifdef __SIZEOF_INT128__ // typedef __uint128_t uint128_t; // typedef __int128_t int128_t; // #else // typedef unsigned long uint128_t __attribute__ ((mode(TI))); // typedef long int128_t __attribute__ ((mode(TI))); // #endif // #define WOLFSSL_UINT128_T_DEFINED // #endif //#endif #if SP_WORD_SIZE == 8 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗