diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d4cd4a6 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +/.idea +/.git +/cmake-build-debug-visual-studio +/V6.1.9.45_build20220902_ArmLinux64_ZH_20240802154010_lib.zip +/V6.1.9.48_build20230410_linux64_20240829112751_lib.zip +/V6.1.9.48_build20230410_win64_20240829112623_lib.zip +/build \ No newline at end of file diff --git a/.gitignore b/.gitignore index 37f9834..3366e72 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,12 @@ /.idea /cmake-build-debug-visual-studio +/cmake-build-release-visual-studio *.lib *.dll *.so *.a -*.zip \ No newline at end of file +*.zip +/build +/arm64_linux_lib +/arm64_windows_lib +/amd64_linux_lib \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b48cec..43d9711 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,27 @@ -cmake_minimum_required(VERSION 3.29) -project(HikNetSDKPkg) +cmake_minimum_required(VERSION 3.15) +project(HikNetSDKPkg CXX) set(CMAKE_CXX_STANDARD 11) -include_directories("./src/include/Hik/amd64") -add_compile_definitions(Export) + +set(OS ${CMAKE_HOST_SYSTEM_NAME}) +set(Arch ${CMAKE_HOST_SYSTEM_PROCESSOR}) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build) + +message(STATUS "Target Operating System: ${OS}") +message(STATUS "Target Architecture: ${Arch}") + +if(OS STREQUAL "Windows") + set(CMAKE_DEBUG_POSTFIX "_win_amd64_d") + set(CMAKE_RELEASE_POSTFIX "_win_amd64") +elseif (Arch STREQUAL "x86_64" OR Arch STREQUAL "amd64") + set(CMAKE_DEBUG_POSTFIX "_linux_amd64_d") + set(CMAKE_RELEASE_POSTFIX "_linux_amd64") +elseif (Arch STREQUAL "aarch64" OR Arch STREQUAL "arm64") + set(CMAKE_DEBUG_POSTFIX "_linux_arm64_d") + set(CMAKE_RELEASE_POSTFIX "_linux_arm64") +endif () add_library(HikNetSDKPkg SHARED library.cpp @@ -13,8 +31,34 @@ add_library(HikNetSDKPkg SHARED src/FormatTrans.cpp ) +target_compile_definitions(HikNetSDKPkg PRIVATE Export) -target_link_directories(HikNetSDKPkg PUBLIC ./HCNetSDKamd64/lib) -target_link_libraries(HikNetSDKPkg "HCNetSDK.lib") -target_link_libraries(HikNetSDKPkg "HCCore.lib") -target_link_libraries(HikNetSDKPkg "GdiPlus.lib") +if(Arch STREQUAL "x86_64" OR OS STREQUAL "Windows") + target_include_directories(HikNetSDKPkg PRIVATE "./src/include/Hik/amd64") +elseif (Arch STREQUAL "aarch64") + target_include_directories(HikNetSDKPkg PRIVATE "./src/include/Hik/arm64") +endif () + +if(OS STREQUAL "Windows") + target_link_directories(HikNetSDKPkg PRIVATE "./arm64_windows_lib") + target_link_libraries(HikNetSDKPkg PRIVATE "HCNetSDK.lib") + target_link_libraries(HikNetSDKPkg PRIVATE "HCCore.lib") + target_link_libraries(HikNetSDKPkg PRIVATE "GdiPlus.lib") +elseif (Arch STREQUAL "x86_64") + target_link_directories(HikNetSDKPkg PRIVATE "./amd64_linux_lib") + target_link_libraries(HikNetSDKPkg "libHCCore.so") + target_link_libraries(HikNetSDKPkg "libhcnetsdk.so") + target_link_libraries(HikNetSDKPkg "libhpr.so") + target_link_libraries(HikNetSDKPkg "libz.so") +elseif (Arch STREQUAL "aarch64") + target_link_directories(HikNetSDKPkg PRIVATE "./arm64_linux_lib") + target_link_libraries(HikNetSDKPkg "libAudioRender.so") + target_link_libraries(HikNetSDKPkg "libcrypto.so") + target_link_libraries(HikNetSDKPkg "libHCCore.so") + target_link_libraries(HikNetSDKPkg "libhcnetsdk.so") + target_link_libraries(HikNetSDKPkg "libhpr.so") + target_link_libraries(HikNetSDKPkg "libPlayCtrl.so") + target_link_libraries(HikNetSDKPkg "libssl.so") + target_link_libraries(HikNetSDKPkg "libSuperRender.so") + target_link_libraries(HikNetSDKPkg "libz.so") +endif () \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6086e19 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +FROM alpine:3.19 AS deps + +WORKDIR /usr + +RUN apk add gcc g++ cmake make acl + +FROM alpine:3.19 AS build + +WORKDIR /hikbuild + +COPY --from=deps /usr /usr +COPY --from=deps /lib /lib +COPY . /hikbuild + +RUN cmake . -D Arch=${TARGETARCH} -D CMAKE_BUILD_TYPE=RELEASE && make + +FROM alpine:3.19 AS export + +WORKDIR /home +COPY --from=build /hikbuild/build /home + +#docker buildx build --platform linux/amd64,linux/arm64 --output type=local,dest=/hikbuild/ . \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2307016 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +## 已验证系统环境 + +| 架构 | 系统 |使用docker | +|:-------:|:-----------:|:-------:| +| aarch64 | alpine:3.19 | 🐳 | +| x86_64 | alpine:3.19 | 🐳 | +| x86_64 | windows 10 | | + +## 编译流程 +### 1. 下载库 +在仓库的发行版中 将 HikNetSDK 标签下的不同架构的 lib 放在源码根目录中 +```shell +D:. +│ V6.1.9.45_build20220902_ArmLinux64_ZH_20240802154010_lib.zip +│ V6.1.9.48_build20230410_linux64_20240829112751_lib.zip +│ V6.1.9.48_build20230410_win64_20240829112623_lib.zip +``` +### 2.1 编译 Linux 部分 +将下载的zip压缩文件 `ArmLinux64` 和 `linux64` 在源码目录解压,然后重命名 +```shell +V6.1.9.45···ArmLinux64···.zip --解压后重命名为--> arm64_linux_lib +V6.1.9.48···linux64···.zip --解压后重命名为--> amd64_linux_lib +``` +### 2.2 编译 Windows 部分 +将下载的zip压缩文件 `win64` 在源码目录解压,然后重命名 +```shell +V6.1.9.45···win64···.zip --解压后重命名为--> arm64_windows_lib +``` diff --git a/include/library.h b/include/library.h index 37ea326..98fe317 100644 --- a/include/library.h +++ b/include/library.h @@ -1,13 +1,18 @@ #ifndef HIKVISION_NETWORK_SDK_PACKAGING_LIBRARY_LIBRARY_H #define HIKVISION_NETWORK_SDK_PACKAGING_LIBRARY_LIBRARY_H -#ifdef Export -#define Omnimatrix __declspec(dllexport) +#ifdef _WIN32 + #ifdef Export + #define Omnimatrix __declspec(dllexport) + #else + #define Omnimatrix __declspec(dllimport) + #endif #else -#define Omnimatrix __declspec(dllimport) + #define Omnimatrix #endif + #ifdef __cplusplus extern "C" { #endif diff --git a/library.cpp b/library.cpp index df023de..981da3c 100644 --- a/library.cpp +++ b/library.cpp @@ -63,7 +63,7 @@ char* CheckTimeRegionWithMonth(void* PtrHIKNvr,int year,int month){ res = HIKNvrObj->TimeToJson(select_time, &available_date_vec).dump(); } char* cString = new char[res.size() + 1]; - strcpy_s(cString, res.size()+1,res.c_str()); + std::strcpy(cString,res.c_str()); return cString; } @@ -81,6 +81,6 @@ char* CheckTimeRegionWithDay(void* PtrHIKNvr,int year,int month,int day){ res = HIKNvrObj->TimeToJsonInDay(select_time, &available_time_vec).dump(); } char* cString = new char[res.size() + 1]; - strcpy_s(cString, res.size()+1,res.c_str()); + std::strcpy(cString,res.c_str()); return cString; } \ No newline at end of file