From df9ad3fc4e46f17ceb5ca32322be18a7976b727b Mon Sep 17 00:00:00 2001 From: taynpg Date: Tue, 24 Mar 2026 08:57:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0package=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- Build.bat | 80 +++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 64 +++++++++++++++++++++++++++++-- cmake/cxxLibrary.cmake.in | 16 ++++++++ 4 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 Build.bat create mode 100644 cmake/cxxLibrary.cmake.in diff --git a/.gitignore b/.gitignore index fe107f6..89a8695 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ build/ .cache/ .qtcreator/ .vs -out/ \ No newline at end of file +out/ +debug/ +release/ \ No newline at end of file diff --git a/Build.bat b/Build.bat new file mode 100644 index 0000000..50b6427 --- /dev/null +++ b/Build.bat @@ -0,0 +1,80 @@ +@echo off +setlocal enabledelayedexpansion + +:: Configuration +set INSTALL_PREFIX=C:/local/cxxLibrary +set BUILD_DEBUG_DIR=debug +set BUILD_RELEASE_DIR=release +set CMAKE_GENERATOR="MinGW Makefiles" + +echo ======================================== +echo cxxLibrary Build and Install Script +echo ======================================== +echo. + +:: Check CMake availability +where cmake >nul 2>nul +if %ERRORLEVEL% neq 0 ( + echo [ERROR] CMake not found in PATH! + echo Please ensure CMake is installed and added to system PATH. + pause + exit /b 1 +) + +:: Check MinGW availability +where mingw32-make >nul 2>nul +if %ERRORLEVEL% neq 0 ( + echo [WARNING] mingw32-make not found in PATH! + echo This may cause build failures if using MinGW generator. + echo. +) + +:: Build Debug configuration +echo [1/4] Configuring Debug build... +cmake -B%BUILD_DEBUG_DIR% -G %CMAKE_GENERATOR% -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%INSTALL_PREFIX% +if %ERRORLEVEL% neq 0 ( + echo [ERROR] Debug configuration failed! + pause + exit /b 1 +) + +echo [2/4] Building and installing Debug version... +cmake --build %BUILD_DEBUG_DIR% --target install +if %ERRORLEVEL% neq 0 ( + echo [ERROR] Debug build/install failed! + pause + exit /b 1 +) + +:: Build Release configuration +echo [3/4] Configuring Release build... +cmake -B%BUILD_RELEASE_DIR% -G %CMAKE_GENERATOR% -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%INSTALL_PREFIX% +if %ERRORLEVEL% neq 0 ( + echo [ERROR] Release configuration failed! + pause + exit /b 1 +) + +echo [4/4] Building and installing Release version... +cmake --build %BUILD_RELEASE_DIR% --target install +if %ERRORLEVEL% neq 0 ( + echo [ERROR] Release build/install failed! + pause + exit /b 1 +) + +:: Verification +echo. +echo ======================================== +echo Build completed successfully! +echo ======================================== +echo Library installed to: %INSTALL_PREFIX% +echo Debug build directory: %BUILD_DEBUG_DIR% +echo Release build directory: %BUILD_RELEASE_DIR% +echo. +echo To use this library in other projects, add to CMake: +echo list(APPEND CMAKE_PREFIX_PATH "%INSTALL_PREFIX%") +echo find_package(cxxLibrary REQUIRED) +echo target_link_libraries(your_target PRIVATE cxxLibrary::cxxLibrary) +echo ======================================== +pause \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index bb0a5f3..89f9fa2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(cxxLibrary LANGUAGES CXX) +project(cxxLibrary VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(SOURCES @@ -14,18 +14,74 @@ file(GLOB_RECURSE BOOST_SOURCES ) add_library(cxxLibrary STATIC ${SOURCES} ${BOOST_SOURCES}) -target_include_directories(cxxLibrary PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) + +# 修正1:使用相对路径,避免绝对路径警告 +target_include_directories(cxxLibrary PUBLIC + $ + $ +) + if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_SYSTEM_NAME MATCHES "Windows") target_link_libraries(cxxLibrary PUBLIC ws2_32 bcrypt ntdll) endif() + target_compile_definitions(cxxLibrary PUBLIC BOOST_ALL_NO_LIB BOOST_ALL_NO_LIBRARY BOOST_FILESYSTEM_NO_CXX20_ATOMIC_REF ) -set_target_properties(cxxLibrary PROPERTIES DEBUG_POSTFIX "d" - # 可选:设置 Release 版本后缀 + +set_target_properties(cxxLibrary PROPERTIES + DEBUG_POSTFIX "d" + # 可选:设置其他配置的后缀 # RELEASE_POSTFIX "" # RELWITHDEBINFO_POSTFIX "rd" # MINSIZEREL_POSTFIX "s" ) + +# 修正2:添加头文件安装 +# 如果include目录中有头文件,需要单独安装它们 +install(DIRECTORY include/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" + PATTERN "*.hpp" +) + +# 安装目标 +install(TARGETS cxxLibrary + EXPORT cxxLibraryTargets # 用于生成导出文件 + ARCHIVE DESTINATION lib # 静态库安装到lib目录 + LIBRARY DESTINATION lib # 动态库安装到lib目录 + RUNTIME DESTINATION bin # Windows的DLL + INCLUDES DESTINATION include # 头文件安装位置 +) + +# 安装导出文件 +install(EXPORT cxxLibraryTargets + FILE cxxLibraryTargets.cmake + NAMESPACE cxxLibrary:: # 添加命名空间 + DESTINATION lib/cmake/cxxLibrary +) + +include(CMakePackageConfigHelpers) + +# 生成配置文件 +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cxxLibrary.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cxxLibraryConfig.cmake" + INSTALL_DESTINATION lib/cmake/cxxLibrary +) + +# 生成版本文件 +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/cxxLibraryConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) + +# 安装生成的文件 +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/cxxLibraryConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/cxxLibraryConfigVersion.cmake" + DESTINATION lib/cmake/cxxLibrary +) \ No newline at end of file diff --git a/cmake/cxxLibrary.cmake.in b/cmake/cxxLibrary.cmake.in new file mode 100644 index 0000000..349d086 --- /dev/null +++ b/cmake/cxxLibrary.cmake.in @@ -0,0 +1,16 @@ +@PACKAGE_INIT@ + +# 包含导出的目标文件 +include("${CMAKE_CURRENT_LIST_DIR}/cxxLibraryTargets.cmake") + +# 手动设置包含路径 +get_target_property(cxxLibrary_INCLUDE_DIRS cxxLibrary::cxxLibrary INTERFACE_INCLUDE_DIRECTORIES) +if(NOT cxxLibrary_INCLUDE_DIRS) + set(cxxLibrary_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include") +endif() + +# 设置找到的变量 +set(cxxLibrary_VERSION @PROJECT_VERSION@) +set(cxxLibrary_VERSION_STRING "@PROJECT_VERSION@") +set(cxxLibrary_FOUND TRUE) +message(STATUS "Found cxxLibrary version ${cxxLibrary_VERSION}") \ No newline at end of file