编译 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

  

 

posted @   strive-sun  阅读(155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示