[√]腾讯云C++ SDK集成到cocos里面

408 阅读3分钟

腾讯云C++ SDK

使用cmake编译后,报错

LNK1104	无法打开文件“PocoFoundationd.lib”	cos-demo 
  • CMkaeLists.txt:定义poco库
set(POCO_LIBS 
    PocoNetSSL 
    PocoNet 
    PocoCrypto 
    PocoUtil 
    PocoJSON 
    PocoXML 
    PocoFoundation
)

demo的包含目录

image.png

demo的 库目录

image.png

demo的依赖库

image.png

我是使用的debug配置编译的,发现这个copy的逻辑很明显只能往release模式下copy

if(${OS_TYPE} STREQUAL "WINDOWS")
    file(GLOB poco_libs "${CMAKE_SOURCE_DIR}/third_party/lib/${BUILD_TARGET}/poco/*")
    file(GLOB ssl_libs "${CMAKE_SOURCE_DIR}/third_party/lib/${BUILD_TARGET}/openssl/*")
    file(COPY ${poco_libs}
            DESTINATION ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})
    file(COPY ${ssl_libs}
            DESTINATION ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})
endif()

必须得通过cmake指定build_type,其实得配合add_custom_command

正确配置好后,发现debug过不去,仍旧报错LNK1104 无法打开文件“PocoFoundationd.lib” cos-demo,但是release就正常,是lib不能用于debug版本导致的,作者也没有上传debug版本的lib

编译poco

确定poco版本

游戏是32位的,肯定要找到32位,既然官方没有内置win32的dll,那么就需要我们自己编译,能看到默认使用的是1.9.4.0

image.png

为了安全起见,我们就需要编译这个版本的代码,poco支持cmake编译。

尝试编译cos的debug版本

cos要编译出其他版本,感觉还是需要编译出对应的debug/release版本,否则会给调试带来麻烦,这样就需要把所有的依赖都给编译一遍。

我修改了cos的camke,支持复制debug版本的dll、lib文件,但是在编译debug版本的时候报错

image.png

PocoNetSSL.lib在Poco的cmake工程里面的确没有,所以也就没生成

image.png

而这个PocoNetSSL库是配置在NetSSL_OpenSSL里面

image.png

而在Poco的CMake里面写了,需要找到OpenSSL才能加入NetSSL_OpenSSL库的编译

image.png

而项目里面引用了openssl子模块

image.png

将子模块更新到本地

git submodule update --init --recursive

一共有2个子模块,这2个模块都是poco自己的仓库

[submodule "gradle"]
	url = https://github.com/pocoproject/gradle
[submodule "openssl"]
	url = https://github.com/pocoproject/openssl

编译pocoNetSSL

我们先尝试打开NETSSL_WIN试下,生成的结果不是我们想要的

image.png

image.png

安装openssl

我尝试着安装了openssl 3.1.2,同时设置环境变量OPENSSL_ROOT_DIRC:\Program Files (x86)\OpenSSL-Win32

cmake buid有提示:

[cmake] -- Found OpenSSL: 
  optimized;
    C:/Program Files (x86)/OpenSSL-Win32/lib/VC/libcrypto32MD.lib;
  debug;
    C:/Program Files (x86)/OpenSSL-Win32/lib/VC/libcrypto32MDd.lib   

image.png

出现这个问题大概率还是我使用的openssl版本问题,submodule中有提示使用的是120,没有找到这个版本,于是下载了openssl 1.1.1,发现之前的版本卸载不干净,即使卸载了cmake依旧能够find,有点恶心,懒得解决了,直接覆盖安装,之后就正常编译通过了。

划重点: 使用openssl 1.1.1即可

使用summodule

尝试设置CMAKE_MODULE_PATHfind_package(OpenSSL)不区分name大小写,所以查找目标就是CMAKE_MODULE_PATH/opensll,这种方法我没有成功,就不折腾了

生成出来的poco库文件debug版本都带字母d

  • poco/CMakeLists.txt
option(POCO_STATIC  "Set to OFF|ON (default is OFF) to control build of POCO as STATIC library" OFF)
  • cmake\DefinePlatformSpecifc.cmake
if(POCO_STATIC)
        set(CMAKE_DEBUG_POSTFIX "${STATIC_POSTFIX}d" CACHE STRING "Set Debug library postfix" FORCE)
        set(CMAKE_RELEASE_POSTFIX "${STATIC_POSTFIX}" CACHE STRING "Set Release library postfix" FORCE)
        set(CMAKE_MINSIZEREL_POSTFIX "${STATIC_POSTFIX}" CACHE STRING "Set MinSizeRel library postfix" FORCE)
        set(CMAKE_RELWITHDEBINFO_POSTFIX "${STATIC_POSTFIX}" CACHE STRING "Set RelWithDebInfo library postfix" FORCE)
else(POCO_STATIC)
        set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Set Debug library postfix" FORCE)
        set(CMAKE_RELEASE_POSTFIX "" CACHE STRING "Set Release library postfix" FORCE)
        set(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "Set MinSizeRel library postfix" FORCE)
        set(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "Set RelWithDebInfo library postfix" FORCE)
endif()

既然是POCO_STATIC在控制,配置下vscode cmake tools配置即可

{
    "cmake.buildDirectory": "${workspaceFolder}/cmake-build",
    "cmake.configureArgs": [
        "-DPOCO_STATIC=ON"
    ]
}

看错了,这里只能修改CMAKE_DEBUG_POSTFIX,实践发现还必须加上d,否则vs在编译debug的时候,会默认加上d去寻找库文件,现在是出现了无法找到PocoNetSSL.lib,感觉还是openssl的问题导致的,可能还得考虑使用submodule的openssl

依赖关系:

  • cos c++ sdk
    • poco (1.9.4)
      • openssl (poco自己编译好的lib,v1.1.0.0)

换而言之,如果要走jni这条路,要把上边所涉及到的所有模块都跨平台编译一遍。

poco有mac,但是没有ios,不确定poco是否支持ios,在最新版本的poco代码中也没有明确定义ios

  • Foundation\include\Poco\Platform.h
//
// Platform Identification
//
#define POCO_OS_FREE_BSD      0x0001
#define POCO_OS_AIX           0x0002
#define POCO_OS_HPUX          0x0003
#define POCO_OS_TRU64         0x0004
#define POCO_OS_LINUX         0x0005
#define POCO_OS_MAC_OS_X      0x0006// mac
#define POCO_OS_NET_BSD       0x0007
#define POCO_OS_OPEN_BSD      0x0008
#define POCO_OS_IRIX          0x0009
#define POCO_OS_SOLARIS       0x000a
#define POCO_OS_QNX           0x000b
#define POCO_OS_VXWORKS       0x000c
#define POCO_OS_CYGWIN        0x000d
#define POCO_OS_NACL	      0x000e
#define POCO_OS_ANDROID       0x000f // android
#define POCO_OS_UNKNOWN_UNIX  0x00ff
#define POCO_OS_WINDOWS_NT    0x1001 // windows
#define POCO_OS_WINDOWS_CE    0x1011
#define POCO_OS_VMS           0x2001

在官方issues中,也有关于ios的反馈,大概率是ios没有适配。

image.png

poco使用的openssl官方也只给出了win版本,虽然openssl也是跨平台的。 image.png

能看到poco使用的openssl版本为1.1.0.0。

image.png

image.png

目前没有发现cos c++ sdk里面有跨平台编译的痕迹,而且c++ sdk里面只给出了编译Release版本的poco库文件。

但是很明显腾讯没有这么做,各个平台都给出了各自的sdk。

虽然也尝试给出了部分平台的libs,但是android和ios没有给出。

image.png

android sdk分析

下载android的sdk,发现有几个aar体积比较大

image.png

虽然用到了jni,但是发现里面并没有使用c++的sdk去生成so

image.png

里面用的so是msdk

image.png

方案

最后sdk的方案被项目组否决,不要问为什么,这不是你要关心的。

转头去研究了xml api的方式和cos交互

使用xml api的方式仍旧需要请求签名,cos官方也介绍了他们已经实现了各个语言的签名,如果你使用c++,又回到了他们写的c++ sdk,当你要把他们的c++ sdk中关于请求签名的逻辑剥离出来的时候,你又会遇到要poco

image.png

cos之所以要使用poco,就是内置了签名所需要的算法,问题又回到了原点。

既然c++签不了名,那就让服务器做这件事,客户端只需要拿到签名结果就行了,曲线救国。

数据压缩

腾讯云CDN返回资源的压缩配置文档