From bbe4ca7bae87893ead610912e6d129a28ffe97d9 Mon Sep 17 00:00:00 2001 From: feihongxu0824 Date: Mon, 20 Apr 2026 22:08:34 +0800 Subject: [PATCH] minor: fix c example cmake and build c++ dynamic lib (#347) --- .github/workflows/04-android-build.yml | 13 +- .github/workflows/05-windows-build.yml | 24 +++ examples/c++/CMakeLists.txt | 218 +++---------------------- examples/c/CMakeLists.txt | 119 ++------------ src/CMakeLists.txt | 147 +++++++++++++++++ src/binding/c/CMakeLists.txt | 35 +--- 6 files changed, 230 insertions(+), 326 deletions(-) diff --git a/.github/workflows/04-android-build.yml b/.github/workflows/04-android-build.yml index 19a4147..092bacb 100644 --- a/.github/workflows/04-android-build.yml +++ b/.github/workflows/04-android-build.yml @@ -411,11 +411,22 @@ jobs: -DCMAKE_CXX_COMPILER_LAUNCHER=ccache cmake --build "$EXAMPLES_BUILD" --parallel + # Reuse the shared-library directory from Step 4; push again in + # case Step 4 was skipped or the directory was cleaned. + DEVICE_LIB_DIR="/data/local/tmp/zvec_tests/lib" + adb shell "mkdir -p $DEVICE_LIB_DIR" 2>/dev/null || true + SO_COUNT=0 + while IFS= read -r so_file; do + adb push "$so_file" "$DEVICE_LIB_DIR/$(basename "$so_file")" > /dev/null 2>&1 + SO_COUNT=$((SO_COUNT + 1)) + done < <(find "$BUILD_DIR/lib" -name "*.so" -type f 2>/dev/null) + echo "Pushed $SO_COUNT shared libraries to $DEVICE_LIB_DIR" + for example in ailego-example core-example db-example; do if [ -f "$EXAMPLES_BUILD/$example" ]; then echo "=== Running $example ===" adb push "$EXAMPLES_BUILD/$example" "/data/local/tmp/$example" > /dev/null 2>&1 - adb shell "chmod 755 /data/local/tmp/$example && cd /data/local/tmp && ./$example" + adb shell "chmod 755 /data/local/tmp/$example && cd /data/local/tmp && LD_LIBRARY_PATH=$DEVICE_LIB_DIR ./$example" adb shell "rm -f /data/local/tmp/$example" fi done diff --git a/.github/workflows/05-windows-build.yml b/.github/workflows/05-windows-build.yml index ca0be0c..9922e03 100644 --- a/.github/workflows/05-windows-build.yml +++ b/.github/workflows/05-windows-build.yml @@ -97,6 +97,30 @@ jobs: cd build cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build . --config Release --parallel $env:NPROC + + # Copy zvec.dll next to the example executables so Windows can find it. + # CMake places DLLs in bin/ (RUNTIME output) and import libs in lib/. + $buildDir = "$env:GITHUB_WORKSPACE\build" + $found = $false + foreach ($sub in @("$buildDir\bin", "$buildDir\bin\Release", "$buildDir\lib", "$buildDir\lib\Release")) { + if (Test-Path "$sub\zvec.dll") { + Copy-Item "$sub\zvec.dll" -Destination . -Force + Write-Host "Copied zvec.dll from $sub" + $found = $true + break + } + } + if (-not $found) { + Write-Host "WARNING: zvec.dll not found, searching recursively..." + $dll = Get-ChildItem -Path $buildDir -Filter "zvec.dll" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($dll) { + Copy-Item $dll.FullName -Destination . -Force + Write-Host "Copied zvec.dll from $($dll.DirectoryName)" + } else { + Write-Error "zvec.dll not found anywhere under $buildDir" + } + } + .\db-example.exe .\core-example.exe .\ailego-example.exe diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt index 3c8a15e..c29fdef 100644 --- a/examples/c++/CMakeLists.txt +++ b/examples/c++/CMakeLists.txt @@ -1,12 +1,13 @@ -cmake_minimum_required(VERSION 3.26) +cmake_minimum_required(VERSION 3.13) cmake_policy(SET CMP0077 NEW) project(zvec-example-c++) set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Enable compile_commands.json set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -# --- Paths to Zvec and dependencies --- +# --- Paths to Zvec --- # Allow custom host build directory, default to "build" if(NOT DEFINED HOST_BUILD_DIR) set(HOST_BUILD_DIR "build") @@ -14,215 +15,46 @@ endif() set(ZVEC_INCLUDE_DIR ${CMAKE_BINARY_DIR}/../../../src/include) set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib) -set(ZVEC_DEPENDENCY_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/external/usr/local/lib) # Add include and library search paths include_directories(${ZVEC_INCLUDE_DIR}) -link_directories(${ZVEC_LIB_DIR} ${ZVEC_DEPENDENCY_LIB_DIR}) +link_directories(${ZVEC_LIB_DIR}) -# Support multi-config builds (libs in Release/ or Debug/ subdirectories) -if (CMAKE_BUILD_TYPE) - link_directories( - ${ZVEC_LIB_DIR}/${CMAKE_BUILD_TYPE} - ${ZVEC_DEPENDENCY_LIB_DIR}/${CMAKE_BUILD_TYPE} - ) -endif () -set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - -# --- Determine debug/release library names --- -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(GLOG_LIB glogd) - if (WIN32) - set(GFLAGS_LIB gflags_nothreads_static_debug) - else () - set(GFLAGS_LIB gflags_nothreads_debug) - endif () - set(PROTOBUF_LIB protobufd) -else() - set(GLOG_LIB glog) - if (WIN32) - set(GFLAGS_LIB gflags_nothreads_static) - else () - set(GFLAGS_LIB gflags_nothreads) - endif () - set(PROTOBUF_LIB protobuf) +# Support multi-config builds (MSVC puts libs in Debug/Release subdirectories) +if(CMAKE_BUILD_TYPE) + link_directories(${ZVEC_LIB_DIR}/${CMAKE_BUILD_TYPE}) +endif() +if(WIN32) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() -# --- Dependency groups --- find_package(Threads REQUIRED) - -set(zvec_core_deps - zvec_turbo +# --- Create INTERFACE target for libzvec (all-in-one C++ shared library) --- +# libzvec.so/.dylib/.dll already bundles all zvec internal components +# (zvec_db, zvec_core, zvec_ailego, zvec_turbo), so no individual dependency +# libraries need to be specified by the consumer. +add_library(zvec-lib INTERFACE) +target_link_libraries(zvec-lib INTERFACE + zvec + Threads::Threads ) - -if (NOT WIN32) - set(zvec_ailego_deps - arrow - parquet - arrow_bundled_dependencies - ${CMAKE_THREAD_LIBS_INIT} - ${CMAKE_DL_LIBS} - ) - - set(zvec_db_deps - roaring - rocksdb - arrow - arrow_acero - arrow_bundled_dependencies - arrow_compute - arrow_dataset - parquet - antlr4-runtime - ${GLOG_LIB} - ${GFLAGS_LIB} - ${PROTOBUF_LIB} - lz4 - ) -else () - # Windows static libraries use different naming conventions - set(PROTOBUF_LIB libprotobuf) - set(zvec_ailego_deps - arrow_static - parquet_static - arrow_bundled_dependencies - ${CMAKE_THREAD_LIBS_INIT} - ${CMAKE_DL_LIBS} - ) - set(zvec_db_deps - roaring - rocksdb - arrow_static - arrow_acero_static - arrow_bundled_dependencies - arrow_compute_static - arrow_dataset_static - parquet_static - antlr4-runtime-static - ${GLOG_LIB} - ${GFLAGS_LIB} - ${PROTOBUF_LIB} - lz4 - rpcrt4 - shlwapi - ) -endif () - -# --- Create INTERFACE targets for Zvec components --- - -# zvec_ailego: links libzvec_ailego.a + its deps -add_library(zvec-ailego INTERFACE) -if (WIN32) - target_link_libraries(zvec-ailego INTERFACE - zvec_ailego - ${zvec_ailego_deps} - ) -else () - target_link_libraries(zvec-ailego INTERFACE - -lzvec_ailego - ${zvec_ailego_deps} - ) -endif () - -# zvec_core: links libzvec_core.a via special flags (handled externally), but declare logical deps -add_library(zvec-core INTERFACE) -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_link_libraries(zvec-core INTERFACE - -Wl,--whole-archive - zvec_core - -Wl,--no-whole-archive - -Wl,--start-group - zvec-ailego - ${zvec_core_deps} - -Wl,--end-group - ) -elseif(APPLE) - target_link_libraries(zvec-core INTERFACE - -Wl,-force_load ${ZVEC_LIB_DIR}/libzvec_core.a - zvec-ailego - ${zvec_core_deps} - ) -elseif(ANDROID) - target_link_libraries(zvec-core INTERFACE - -Wl,--whole-archive - zvec_core - -Wl,--no-whole-archive - -Wl,--start-group - zvec-ailego - ${zvec_core_deps} - -Wl,--end-group - ) -elseif (WIN32) - target_link_libraries(zvec-core INTERFACE - zvec_core - zvec-ailego - ${zvec_core_deps} - ) - target_link_options(zvec-core INTERFACE "/WHOLEARCHIVE:zvec_core") -else() - message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}") +if(NOT WIN32) + target_link_libraries(zvec-lib INTERFACE ${CMAKE_DL_LIBS}) endif() -# zvec_db: links libzvec_db.a + all deps -add_library(zvec-db INTERFACE) -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_link_libraries(zvec-db INTERFACE - zvec_db - zvec-core - zvec-ailego - -Wl,--start-group - ${zvec_db_deps} - -Wl,--end-group - ) -elseif(APPLE) - target_link_libraries(zvec-db INTERFACE - zvec_db - zvec-core - zvec-ailego - ${zvec_db_deps} - ) -elseif(ANDROID) - target_link_libraries(zvec-db INTERFACE - zvec_db - zvec-core - zvec-ailego - -Wl,--start-group - ${zvec_db_deps} - -Wl,--end-group - ) -elseif (WIN32) - target_link_libraries(zvec-db INTERFACE - zvec_db - zvec-core - zvec-ailego - ${zvec_db_deps} - ) -else() - message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}") -endif() - - -# --- Main executable --- +# --- Executables --- add_executable(db-example db/main.cc) -target_link_libraries(db-example PRIVATE - zvec-db -) +target_link_libraries(db-example PRIVATE zvec-lib) if(ANDROID) - target_link_libraries(db-example PRIVATE - log - ) + target_link_libraries(db-example PRIVATE log) endif() add_executable(core-example core/main.cc) -target_link_libraries(core-example PRIVATE - zvec-core -) +target_link_libraries(core-example PRIVATE zvec-lib) add_executable(ailego-example ailego/main.cc) -target_link_libraries(ailego-example PRIVATE - zvec-ailego -) +target_link_libraries(ailego-example PRIVATE zvec-lib) # Strip symbols to reduce executable size if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ANDROID) diff --git a/examples/c/CMakeLists.txt b/examples/c/CMakeLists.txt index 5edb881..126ee5d 100644 --- a/examples/c/CMakeLists.txt +++ b/examples/c/CMakeLists.txt @@ -29,115 +29,32 @@ endif() set(ZVEC_INCLUDE_DIR ${CMAKE_BINARY_DIR}/../../../src/include) set(ZVEC_GENERATED_INCLUDE_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/src/generated) - -# On Windows, libraries are in Debug/Release subdirectories -if(WIN32) - set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib/$) - set(ZVEC_DEPENDENCY_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/external/usr/local/lib/$) -else() - set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib) - set(ZVEC_DEPENDENCY_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/external/usr/local/lib) -endif() +set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib) # Add include and library search paths include_directories(${ZVEC_INCLUDE_DIR} ${ZVEC_GENERATED_INCLUDE_DIR}) -link_directories(${ZVEC_LIB_DIR} ${ZVEC_DEPENDENCY_LIB_DIR}) +link_directories(${ZVEC_LIB_DIR}) + +# Support multi-config builds (MSVC puts libs in Debug/Release subdirectories) +if(CMAKE_BUILD_TYPE) + link_directories(${ZVEC_LIB_DIR}/${CMAKE_BUILD_TYPE}) +endif() # Find required packages find_package(Threads REQUIRED) -# --- Determine debug/release library names --- -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(GLOG_LIB glogd) - set(GFLAGS_LIB gflags_nothreads_debug) - set(PROTOBUF_LIB protobufd) -else() - set(GLOG_LIB glog) - set(GFLAGS_LIB gflags_nothreads) - set(PROTOBUF_LIB protobuf) -endif() - -# --- Dependency groups --- -if(NOT WIN32) - set(zvec_c_api_deps - roaring - rocksdb - arrow - arrow_acero - arrow_bundled_dependencies - arrow_compute - arrow_dataset - parquet - antlr4-runtime - ${GLOG_LIB} - ${GFLAGS_LIB} - ${PROTOBUF_LIB} - lz4 - ${CMAKE_THREAD_LIBS_INIT} - ${CMAKE_DL_LIBS} - ) -else() - # Windows static libraries use different naming conventions - set(PROTOBUF_LIB libprotobuf) - set(zvec_c_api_deps - roaring - rocksdb - arrow_static - arrow_acero_static - arrow_bundled_dependencies - arrow_compute_static - arrow_dataset_static - parquet_static - antlr4-runtime-static - ${GLOG_LIB} - ${GFLAGS_LIB} - ${PROTOBUF_LIB} - lz4 - ${CMAKE_THREAD_LIBS_INIT} - rpcrt4 - shlwapi - ) -endif() - -# Create INTERFACE target for zvec_c_api with platform-specific linking +# Create INTERFACE target for zvec_c_api (fat shared library) +# No whole-archive flags needed — all symbols are already resolved in the .so/.dylib add_library(zvec-c-api INTERFACE) -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_link_libraries(zvec-c-api INTERFACE - -Wl,--whole-archive - -lzvec_c_api - -Wl,--no-whole-archive - -Wl,--start-group - ${zvec_c_api_deps} - -Wl,--end-group - ) -elseif(APPLE) - # On macOS, use -Wl,-force_load with full path to ensure all symbols are loaded - target_link_libraries(zvec-c-api INTERFACE - -Wl,-force_load - ${ZVEC_LIB_DIR}/libzvec_c_api.dylib - ${zvec_c_api_deps} - ) - # Set rpath so the executable can find the dylib at runtime - target_link_options(zvec-c-api INTERFACE - -Wl,-rpath,${ZVEC_LIB_DIR} - ) -elseif(ANDROID) - target_link_libraries(zvec-c-api INTERFACE - -Wl,--whole-archive - -lzvec_c_api - -Wl,--no-whole-archive - -Wl,--start-group - ${zvec_c_api_deps} - -Wl,--end-group - ) -elseif(WIN32) - target_link_libraries(zvec-c-api INTERFACE - zvec_c_api - ${zvec_c_api_deps} - ) - target_link_options(zvec-c-api INTERFACE "/WHOLEARCHIVE:zvec_c_api") -else() - message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}") +target_link_libraries(zvec-c-api INTERFACE + zvec_c_api + Threads::Threads +) +if(NOT WIN32) + target_link_libraries(zvec-c-api INTERFACE ${CMAKE_DL_LIBS}) +endif() +if(APPLE) + target_link_options(zvec-c-api INTERFACE -Wl,-rpath,${ZVEC_LIB_DIR}) endif() # Basic example diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c9747a0..a3787dc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,3 +10,150 @@ cc_directory(turbo) cc_directory(core) cc_directory(db) cc_directory(binding) + +# ============================================================================= +# Build ALL-IN-ONE C++ Shared Library (libzvec.so / libzvec.dylib) +# ============================================================================= +# Merges all zvec internal static libraries (zvec_db, zvec_core, zvec_ailego, +# zvec_turbo) into a single shared library, exposing the full C++ interface. +# Unlike zvec_c_api which only exposes C symbols, this library preserves all +# C++ symbols for direct C++ linking. + +include(GNUInstallDirs) +find_package(Threads REQUIRED) + +# Generate a minimal stub source (add_library SHARED requires at least one source) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/zvec_allin_stub.cc + "// Auto-generated stub for zvec all-in-one C++ shared library\n" +) + +add_library(zvec_shared SHARED + ${CMAKE_CURRENT_BINARY_DIR}/zvec_allin_stub.cc +) + +set_target_properties(zvec_shared PROPERTIES + OUTPUT_NAME "zvec" + POSITION_INDEPENDENT_CODE ON + WINDOWS_EXPORT_ALL_SYMBOLS ON +) + +# Determine whole-archive flag for current platform +if(MSVC) + set(ZVEC_ALLIN_WA_PREFIX "/WHOLEARCHIVE:") + set(ZVEC_ALLIN_WA_SUFFIX "") +elseif(APPLE) + set(ZVEC_ALLIN_WA_PREFIX "-Wl,-force_load,") + set(ZVEC_ALLIN_WA_SUFFIX "") +else() + set(ZVEC_ALLIN_WA_PREFIX "-Wl,--whole-archive") + set(ZVEC_ALLIN_WA_SUFFIX "-Wl,--no-whole-archive") +endif() + +# Platform-specific whole-archive linking (mirrors binding/c/CMakeLists.txt) +if(MSVC) + # On MSVC, WINDOWS_EXPORT_ALL_SYMBOLS generates a .def file only from the + # target's own object files. /WHOLEARCHIVE: pulls objects into the DLL but + # they are NOT scanned for the .def, leaving the import library empty. + # Fix: include static-library objects directly via TARGET_OBJECTS (CMake 3.21+) + # so the def-file generator sees every symbol. + target_sources(zvec_shared PRIVATE + $ + $ + $ + $ + ) + target_link_libraries(zvec_shared + PRIVATE + zvec_db + zvec_core + zvec_ailego + zvec_turbo + Threads::Threads + ) +elseif(APPLE) + target_link_options(zvec_shared PRIVATE + ${ZVEC_ALLIN_WA_PREFIX}$ + ${ZVEC_ALLIN_WA_PREFIX}$ + ${ZVEC_ALLIN_WA_PREFIX}$ + ${ZVEC_ALLIN_WA_PREFIX}$ + ) + target_link_libraries(zvec_shared + PRIVATE + zvec_db + zvec_core + zvec_ailego + zvec_turbo + Threads::Threads + ${CMAKE_DL_LIBS} + ) +else() + # Linux and other Unix-like systems + target_link_libraries(zvec_shared + PRIVATE + ${ZVEC_ALLIN_WA_PREFIX} + zvec_db + zvec_core + zvec_ailego + zvec_turbo + ${ZVEC_ALLIN_WA_SUFFIX} + Threads::Threads + ${CMAKE_DL_LIBS} + ) + + # Try static linking of libstdc++ and libgcc for better portability + set(ALLIN_STATIC_LIBS_FOUND FALSE) + execute_process( + COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libstdc++.a + OUTPUT_VARIABLE ALLIN_LIBSTDCPP_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgcc.a + OUTPUT_VARIABLE ALLIN_LIBGCC_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(EXISTS "${ALLIN_LIBSTDCPP_PATH}" AND EXISTS "${ALLIN_LIBGCC_PATH}") + if(IS_ABSOLUTE "${ALLIN_LIBSTDCPP_PATH}" AND IS_ABSOLUTE "${ALLIN_LIBGCC_PATH}") + set(ALLIN_STATIC_LIBS_FOUND TRUE) + endif() + endif() + if(ALLIN_STATIC_LIBS_FOUND) + target_link_options(zvec_shared PRIVATE -static-libstdc++ -static-libgcc) + message(STATUS "zvec_shared: Using static libstdc++ and libgcc") + else() + message(STATUS "zvec_shared: Using dynamic linking for libstdc++ and libgcc") + endif() +endif() + +# Include directories +target_include_directories(zvec_shared + PUBLIC + $ + $ + $ + PRIVATE + ${PROJECT_SOURCE_DIR}/src +) + +# Strip symbols in release builds to reduce library size +if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + if(UNIX AND NOT APPLE) + add_custom_command(TARGET zvec_shared POST_BUILD + COMMAND ${CMAKE_STRIP} $ + COMMENT "Stripping symbols from libzvec.so" + ) + elseif(APPLE) + add_custom_command(TARGET zvec_shared POST_BUILD + COMMAND /usr/bin/strip -x $ + COMMENT "Stripping symbols from libzvec.dylib" + ) + endif() +endif() + +# Installation +install(TARGETS zvec_shared + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + diff --git a/src/binding/c/CMakeLists.txt b/src/binding/c/CMakeLists.txt index 3007478..6533028 100644 --- a/src/binding/c/CMakeLists.txt +++ b/src/binding/c/CMakeLists.txt @@ -111,7 +111,6 @@ if(MSVC) ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ - ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ) target_link_libraries(zvec_c_api @@ -120,34 +119,15 @@ if(MSVC) zvec_core zvec_ailego zvec_turbo - roaring ${ZVEC_CXX_STD_LIB} Threads::Threads ) elseif(APPLE) - # Third-party libraries that are dependencies of zvec_db and zvec_ailego - # These must be linked before the internal libraries that depend on them - target_link_libraries(zvec_c_api - PRIVATE - Arrow::arrow_static - Arrow::parquet_static - Arrow::arrow_compute - Arrow::arrow_dataset - Arrow::arrow_acero - rocksdb - glog - libprotobuf - antlr4 - ) - - # Link zvec internal libraries with -force_load to extract all objects - # Use target names directly with -Wl,-force_load flag target_link_options(zvec_c_api PRIVATE - -Wl,-force_load,$ - -Wl,-force_load,$ - -Wl,-force_load,$ - -Wl,-force_load,$ - -Wl,-force_load,$ + ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ + ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ + ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ + ${ZVEC_WHOLE_ARCHIVE_PREFIX}$ ) # Link the libraries themselves (without force_load flags) @@ -157,7 +137,6 @@ elseif(APPLE) zvec_core zvec_ailego zvec_turbo - roaring Threads::Threads ${CMAKE_DL_LIBS} ) @@ -176,11 +155,6 @@ else() zvec_ailego zvec_turbo # Required by zvec_core (metric module) ${ZVEC_NO_WHOLE_ARCHIVE_SUFFIX} - # Most third-party libs are linked via zvec_db - # Only roaring needs explicit whole-archive (C library) - ${ZVEC_WHOLE_ARCHIVE_PREFIX} - roaring - ${ZVEC_NO_WHOLE_ARCHIVE_SUFFIX} Threads::Threads ${CMAKE_DL_LIBS} ) @@ -188,7 +162,6 @@ else() # Link C++ standard library appropriately for the platform # On Linux, we need to explicitly link libstdc++ # Try static linking first, fall back to dynamic - set(STATIC_LIBS_FOUND FALSE) # Try to find static libraries using compiler's built-in search