소스 검색

1. 增加 Readme.md
2. 修复 CMakeLists.txt 实现多系统多架构构建
3. 添加 Dockerfile 使用 docker 在多系统多架构下进行编译
4. 修复 library.h 和 .cpp 调整 windows 和 linux 库的差异导致的无法编译通过

王帅锟 6 달 전
부모
커밋
1c13ef429c
7개의 변경된 파일125개의 추가작업 그리고 14개의 파일을 삭제
  1. 7 0
      .dockerignore
  2. 6 1
      .gitignore
  3. 52 8
      CMakeLists.txt
  4. 22 0
      Dockerfile
  5. 28 0
      README.md
  6. 8 3
      include/library.h
  7. 2 2
      library.cpp

+ 7 - 0
.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

+ 6 - 1
.gitignore

@@ -1,7 +1,12 @@
 /.idea
 /cmake-build-debug-visual-studio
+/cmake-build-release-visual-studio
 *.lib
 *.dll
 *.so
 *.a
-*.zip
+*.zip
+/build
+/arm64_linux_lib
+/arm64_windows_lib
+/amd64_linux_lib

+ 52 - 8
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)
+
+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 ()
 
-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(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 ()

+ 22 - 0
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/ .

+ 28 - 0
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
+```

+ 8 - 3
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

+ 2 - 2
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;
 }