Java jar打包成exe全攻略:jpackage与体积优化实战
2026/10/1 11:46:52
🎬 艾莉丝的简介:
.a),对外交付产物为:头文件 + 静态库文件。make install将库与头文件安装至系统目录/usr/local,实现全局可被其他项目直接引用。sdk ├─ CMakeLists.txt# SDK的CMake构建脚本├─ include# 对外头文件│ ├─ util │ ├─ ChatGPTProvider.h │ ├─ ChatSDK.h │ ├─ common.h │ ├─ DataManager.h │ ├─ DeepSeekProvider.h │ ├─ GeminiProvider.h │ ├─ LLMManager.h │ ├─ LLMProvider.h │ ├─ OllamaLLMProvider.h │ └─ SessionManager.h └─ src# 实现源文件├─ util ├─ ChatGPTProvider.cpp ├─ ChatSDK.cpp ├─ DataManager.cpp ├─ DeepSeekProvider.cpp ├─ GeminiProvider.cpp ├─ LLMManager.cpp ├─ OllamaLLMProvider.cpp └─ SessionManager.cppadd_executable / add_library中显式罗列全部.cpp源码。.cpp源文件必须手动修改 CMakeLists.txt 添加,遗忘会导致新增文件不参与编译。add_executable(testLLM testLLM.cpp../sdk/src/util/myLog.cpp../sdk/src/DeepSeekProvider.cpp../sdk/src/ChatGPTProvider.cpp../sdk/src/GeminiProvider.cpp../sdk/src/OllamaLLMProvider.cpp../sdk/src/DataManager.cpp../sdk/src/SessionManager.cpp../sdk/src/LLMManager.cpp../sdk/src/ChatSDK.cpp)注意:GLOB 不会监测磁盘文件变更,新增源文件需要重新执行
cmake ..才会被识别。
# 递归收集src目录所有cpp源文件 file(GLOB_RECURSE SDK_SOURCES "src/*.cpp") # 递归收集include目录所有h头文件 file(GLOB_RECURSE SDK_HEADERS "include/*.h")# CMake最低版本约束,必须放在文件最开头cmake_minimum_required(VERSION3.10)# 项目定义project(ai_chat_sdk)# SDK名称变量set(SDK_NAME"ai_chat_sdk")# C++标准配置set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIRED ON)# 构建类型:Release发布版本set(CMAKE_BUILD_TYPE Release)# 递归收集源码与头文件file(GLOB_RECURSE SDK_SOURCES"src/*.cpp")file(GLOB_RECURSE SDK_HEADERS"include/*.h")# 生成静态库 STATIC代表静态库add_library(${SDK_NAME}STATIC${SDK_SOURCES}${SDK_HEADERS})# 设置编译产物输出目录set(EXECUTABLE_OUTPUT_PATH${CMAKE_CURRENT_SOURCE_DIR}/build)# 头文件搜索路径 PUBLIC:使用者也会继承该头文件路径target_include_directories(${SDK_NAME}PUBLIC${CMAKE_CURRENT_SOURCE_DIR}/include)# HTTPS支持宏定义,启用cpp‑httplib的OpenSSL能力target_compile_definitions(${SDK_NAME}PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT)# 查找OpenSSL依赖find_package(OpenSSL REQUIRED)# 第三方库搜索路径link_directories(/usr/local/lib)# 链接依赖库target_link_libraries(${SDK_NAME}jsoncppfmtspdlog sqlite3 OpenSSL::SSL OpenSSL::Crypto)########## install安装规则 make install执行时生效 ########### 安装静态库 ARCHIVE专门用于静态库install(TARGETS${SDK_NAME}ARCHIVE DESTINATION lib)# 批量安装头文件,复制到/usr/local/include/ai_chat_sdkinstall(DIRECTORY${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include/ai_chat_sdk FILES_MATCHING PATTERN"*.h")add_library(xxx STATIC):构建静态库,产物lib${SDK_NAME}.a。target_include_directories PUBLIC:本库编译、外部使用者编译均可看到该头文件目录;PRIVATE 仅本项目内部生效。target_compile_definitions PUBLIC:宏定义会传递给链接本 SDK 的上层项目。install TARGETS ... ARCHIVE DESTINATION lib:静态库安装到${CMAKE_INSTALL_PREFIX}/lib,默认CMAKE_INSTALL_PREFIX=/usr/local。install DIRECTORY:批量复制 include 下全部.h到系统 include 子目录。#ifdef CPPHTTPLIB_OPENSSL_SUPPORT分支内才会#include <openssl/xxx>。target_compile_definitions定义,不能写在代码内。# 进入sdk源码目录cdsdk# 创建构建目录mkdirbuildcdbuild# cmake解析构建脚本cmake..# 编译生成静态库libai_chat_sdk.amake# 安装到系统目录,修改/usr/local需要root权限sudomakeinstall/usr/local/lib/libai_chat_sdk.a/usr/local/include/ai_chat_sdk/OpenSSL::SSL target was not foundfind_package(OpenSSL REQUIRED)调用缺失,找不到导入目标OpenSSL::SSL。find_package(OpenSSL REQUIRED),放在使用OpenSSL::SSL之前。cmake_minimum_required should be called prior to project()cmake_minimum_required()写在了project()之后。make install写/usr/local失败。sudo make install提升权限执行安装。cmake ..,再执行 make。cmake .. && make && sudo make install。#include <ai_chat_sdk/ChatSDK.h>,链接ai_chat_sdk即可。| 属性 | 作用域 |
|---|---|
| PRIVATE | 仅当前库编译时生效,不会传递给链接者 |
| PUBLIC | 当前库 + 所有链接该库的上层项目均生效 |
| INTERFACE | 仅链接该库的上层项目生效,本库编译不生效 |
ARCHIVE DESTINATION lib:专门对应静态库(.a)。LIBRARY DESTINATION lib:专门对应动态库(.so/.dylib)。RUNTIME DESTINATION bin:可执行程序、Windows 下 dll。CMAKE_INSTALL_PREFIX:安装根目录,默认/usr/local,cmake 可通过-DCMAKE_INSTALL_PREFIX=xxx修改安装路径。.a本质是.o目标文件归档包;链接阶段完整复制库内代码到最终可执行文件。uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
|
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!
往期回顾:
【AI大模型接入SDK】ChatSDK 集成测试概述
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა