minor: fix c example cmake and build c++ dynamic lib (#347)

This commit is contained in:
feihongxu0824 2026-04-20 22:08:34 +08:00 committed by GitHub
parent 1e25294c07
commit bbe4ca7bae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 230 additions and 326 deletions

View File

@ -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

View File

@ -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

View File

@ -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$<$<CONFIG:Debug>: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$<$<CONFIG:Debug>: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)

View File

@ -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/$<CONFIG>)
set(ZVEC_DEPENDENCY_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/external/usr/local/lib/$<CONFIG>)
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

View File

@ -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_OBJECTS:zvec_db>
$<TARGET_OBJECTS:zvec_core>
$<TARGET_OBJECTS:zvec_ailego>
$<TARGET_OBJECTS:zvec_turbo>
)
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}$<TARGET_FILE:zvec_db>
${ZVEC_ALLIN_WA_PREFIX}$<TARGET_FILE:zvec_core>
${ZVEC_ALLIN_WA_PREFIX}$<TARGET_FILE:zvec_ailego>
${ZVEC_ALLIN_WA_PREFIX}$<TARGET_FILE:zvec_turbo>
)
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
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/src/generated>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/include>
$<INSTALL_INTERFACE:include>
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} $<TARGET_FILE:zvec_shared>
COMMENT "Stripping symbols from libzvec.so"
)
elseif(APPLE)
add_custom_command(TARGET zvec_shared POST_BUILD
COMMAND /usr/bin/strip -x $<TARGET_FILE:zvec_shared>
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}
)

View File

@ -111,7 +111,6 @@ if(MSVC)
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_core>
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_ailego>
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_turbo>
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:roaring>
)
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,$<TARGET_FILE:zvec_db>
-Wl,-force_load,$<TARGET_FILE:zvec_core>
-Wl,-force_load,$<TARGET_FILE:zvec_ailego>
-Wl,-force_load,$<TARGET_FILE:zvec_turbo>
-Wl,-force_load,$<TARGET_FILE:roaring>
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_db>
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_core>
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_ailego>
${ZVEC_WHOLE_ARCHIVE_PREFIX}$<TARGET_FILE:zvec_turbo>
)
# 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