使用cmake编译后,报错
LNK1104 无法打开文件“PocoFoundationd.lib” cos-demo
- CMkaeLists.txt:定义poco库
set(POCO_LIBS
PocoNetSSL
PocoNet
PocoCrypto
PocoUtil
PocoJSON
PocoXML
PocoFoundation
)
demo的包含目录
demo的 库目录
demo的依赖库
我是使用的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
为了安全起见,我们就需要编译这个版本的代码,poco支持cmake编译。
尝试编译cos的debug版本
cos要编译出其他版本,感觉还是需要编译出对应的debug/release版本,否则会给调试带来麻烦,这样就需要把所有的依赖都给编译一遍。
我修改了cos的camke,支持复制debug版本的dll、lib文件,但是在编译debug版本的时候报错
PocoNetSSL.lib在Poco的cmake工程里面的确没有,所以也就没生成
而这个PocoNetSSL库是配置在NetSSL_OpenSSL里面
而在Poco的CMake里面写了,需要找到OpenSSL才能加入NetSSL_OpenSSL库的编译
而项目里面引用了openssl子模块
将子模块更新到本地
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试下,生成的结果不是我们想要的
安装openssl
我尝试着安装了openssl 3.1.2,同时设置环境变量OPENSSL_ROOT_DIR 为C:\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
出现这个问题大概率还是我使用的openssl版本问题,submodule中有提示使用的是120,没有找到这个版本,于是下载了openssl 1.1.1,发现之前的版本卸载不干净,即使卸载了cmake依旧能够find,有点恶心,懒得解决了,直接覆盖安装,之后就正常编译通过了。
划重点: 使用
openssl 1.1.1即可
使用summodule
尝试设置CMAKE_MODULE_PATH,find_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)
- poco (1.9.4)
换而言之,如果要走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没有适配。
poco使用的openssl官方也只给出了win版本,虽然openssl也是跨平台的。
能看到poco使用的openssl版本为1.1.0.0。
目前没有发现cos c++ sdk里面有跨平台编译的痕迹,而且c++ sdk里面只给出了编译Release版本的poco库文件。
但是很明显腾讯没有这么做,各个平台都给出了各自的sdk。
虽然也尝试给出了部分平台的libs,但是android和ios没有给出。
android sdk分析
下载android的sdk,发现有几个aar体积比较大
虽然用到了jni,但是发现里面并没有使用c++的sdk去生成so
里面用的so是msdk的
方案
最后sdk的方案被项目组否决,不要问为什么,这不是你要关心的。
转头去研究了xml api的方式和cos交互
使用xml api的方式仍旧需要请求签名,cos官方也介绍了他们已经实现了各个语言的签名,如果你使用c++,又回到了他们写的c++ sdk,当你要把他们的c++ sdk中关于请求签名的逻辑剥离出来的时候,你又会遇到要poco
cos之所以要使用poco,就是内置了签名所需要的算法,问题又回到了原点。
既然c++签不了名,那就让服务器做这件事,客户端只需要拿到签名结果就行了,曲线救国。