Skip to content

Feature request: Compile time argument for models folder in cli #18

Open

Description

@Timh1970

I am building a package and installing in a common location to make it easier to use as a global library and am currently patching cli.cpp thus:

src/cli/cli.cpp

--- a/src/cli/cli.cpp	2026-02-06 12:13:30.426359449 +0000
+++ b/src/cli/cli.cpp	2026-02-06 13:56:47.601175698 +0000
@@ -354,8 +354,14 @@
 
 void run_sam(cli_args const& args) {
     backend_device backend = backend_init(args);
+
     auto [file, weights] = load_model_weights(
+#ifdef MODEL_PATH
+        args, backend, MODEL_PATH "/MobileSAM-F16.gguf", 0, backend.preferred_layout());
+#else
         args, backend, "models/MobileSAM-F16.gguf", 0, backend.preferred_layout());
+#endif
+
     sam_params params{};
 
     require_inputs(args.inputs, 1, "<image>");
@@ -408,8 +414,14 @@
 
 void run_birefnet(cli_args const& args) {
     backend_device backend = backend_init(args);
+
+#ifdef MODEL_PATH
     auto [file, weights] = load_model_weights(
-        args, backend, "models/BiRefNet-F16.gguf", 0, backend.preferred_layout());
+        args, backend, MODEL_PATH "/BiRefNet-lite-F16.gguf", 0, backend.preferred_layout());
+#else
+    auto [file, weights] = load_model_weights(
+        args, backend, "models/BiRefNet-lite-F16.gguf", 0, backend.preferred_layout());
+#endif
 
     require_inputs(args.inputs, 1, "<image>");
     image_data image = image_load(args.inputs[0]);
@@ -452,8 +464,14 @@
 
 void run_depth_anything(cli_args const& args) {
     backend_device backend = backend_init(args);
+
+#ifdef MODEL_PATH
+    auto [file, weights] = load_model_weights(
+        args, backend, MODEL_PATH "/DepthAnythingV2-Small-F32.gguf", 0, backend.preferred_layout());
+#else
     auto [file, weights] = load_model_weights(
         args, backend, "models/DepthAnythingV2-Small-F32.gguf", 0, backend.preferred_layout());
+#endif
 
     require_inputs(args.inputs, 1, "<image>");
     image_data image = image_load(args.inputs[0]);
@@ -488,8 +506,15 @@
 
 void run_migan(cli_args const& args) {
     backend_device backend = backend_init(args);
+
+#ifdef MODEL_PATH
+    auto [file, weights] = load_model_weights(
+        args, backend, MODEL_PATH "/MIGAN-512-places2-F16.gguf", backend.preferred_layout());
+#else
     auto [file, weights] = load_model_weights(
         args, backend, "models/MIGAN-512-places2-F16.gguf", backend.preferred_layout());
+#endif
+
     migan_params params = migan_detect_params(file);
     params.invert_mask = true; // -> inpaint opaque areas
 
@@ -526,8 +551,15 @@
 
 void run_esrgan(cli_args const& args) {
     backend_device backend = backend_init(args);
+
+#ifdef MODEL_PATH
+    auto [file, weights] = load_model_weights(
+        args, backend, MODEL_PATH "/RealESRGAN-x4.gguf", 0, backend.preferred_layout());
+#else
     auto [file, weights] = load_model_weights(
         args, backend, "models/RealESRGAN-x4.gguf", 0, backend.preferred_layout());
+#endif
+
     esrgan_params params = esrgan_detect_params(file);
     printf("- scale: %dx\n", params.scale);
     printf("- block count: %d\n", params.n_blocks);

src/cli/CMakeLists.txt

--- a/src/cli/CMakeLists.txt	2026-02-05 23:47:15.000000000 +0000
+++ b/src/cli/CMakeLists.txt	2026-02-06 13:16:26.118842969 +0000
@@ -4,4 +4,5 @@
 target_compile_definitions(vision-cli PRIVATE ${VISP_ASSERT} ${VISP_DEFINITIONS})
 target_compile_options(vision-cli PRIVATE ${VISP_WARNINGS} ${VISP_COMP_OPTIONS})
 target_link_options(vision-cli PRIVATE ${VISP_LINK_OPTIONS})
-target_link_libraries(vision-cli PRIVATE ggml visioncpp ${VISP_FMT_LINK})
\ No newline at end of file
+target_link_libraries(vision-cli PRIVATE ggml visioncpp ${VISP_FMT_LINK})
+target_compile_definitions(vision-cli PRIVATE "MODEL_PATH=\"${MODEL_PATH}\"")

Note Also changed "BiRefNet-F16.gguf" to "BiRefNet-lite-F16.gguf"

If it would be possible to integrate this, or something similar it would be much appreciated.

Activity

  1. Acly commented on Feb 9, 2026

    @Acly
    Owner

    Would a search path make more sense? Something like

    • ./models
    • $XDG_DATA_HOME/visioncpp/models
    • $HOME/.local/share/visioncpp/models
    • ${SYSTEM_MODEL_PATH} (which might be /usr/local/share/visioncpp/models but a cmake variable to override is fine)

    By the way how do you intend to handle the ggml libraries when packaging? They currently aren't compatible with upstream ggml (which may be provided as separate package). I try and upstream most changes, but some of it is very vision-specific, and I'm not confident it will be included in near future.

  2. Timh1970 commented on Feb 9, 2026

    @Timh1970
    Author

    Running cli globally would fail to find the default models if they were in a $HOME folder for users logged in with accounts other than that of the installer so I try to keep dependencies of global applications in global locations; that is why I was minded to put the default models in /usr/share/vision.cpp/models when packaging.

    I have to admit to paying little attention to where the upstream ggml was coming from so that is a whole new issue, but not insurmountable.

    Option 1 (ideal)

    Static linking

    Option 2

    I am thinking install the shared objects in /usr/lib/vision.cpp then when building against vision.cpp it will be a case of

    • -L/usr/share/vision.cpp
      and
    • -Wl,-rpath=/usr/lib/vision.cpp

    I can then bundle a pkg-config file with something like

    • Libs: -L${libdir} -Wl,-rpath=${libdir} -lggml

    and then building against vision.cpp should be just a case of using

    • pkg-config --libs vision.cpp

    There is always the possibility of conflicts with the upstream library when linking but paths in PKG_CONFIG_PATH are searched first, so theoretically this version takes precedence.

    It was kinda lucky I didn't have libggml alreayd on my test boxes or I would have broken something.

  3. Timh1970 commented on Feb 10, 2026

    @Timh1970
    Author

    I have tested building libvisioncpp while statically linking llama and everything works as expected in principle; the downside is the resultant libvisioncpp.so is 50mb but I still think it is a better option than option 2

    Tests show no effect on processing speed so I think static linking is the best solution.

    While I appreciate that I will need to track this and manually update I have changed

    root CMakeLists.txt:

    --- CMakeLists.txt	2026-02-02 17:18:42.662809881 +0000
    +++ CMakeLists.patch.txt	2026-02-09 22:53:04.064581097 +0000
    @@ -85,9 +85,12 @@
     endif()
     
     # Dependencies
    +set(CMAKE_POSITION_INDEPENDENT_CODE ON)
    +
     
     add_subdirectory(depend/stb)
     
    +
     if(VISP_FMT_LIB)
       add_subdirectory(depend/fmt)
       set(VISP_FMT_LINK fmt::fmt)
    @@ -109,7 +112,6 @@
         endforeach()
       endif()
     endif()
    -add_subdirectory(depend/llama/ggml)
     
     # Vision.cpp libraries and executables
     
    @@ -124,6 +126,17 @@
       add_subdirectory(models)
     endif()
     
    +
    +# Save and force static build for llama
    +set(BUILD_SHARED_LIBS_SAVED ${BUILD_SHARED_LIBS})
    +set(BUILD_SHARED_LIBS OFF)
    +set(LLAMA_STATIC ON CACHE BOOL "Build llama as static" FORCE)
    +set(GGML_STATIC ON CACHE BOOL "Build ggml as static" FORCE)
    +set(GGML_BACKEND_DL OFF CACHE BOOL "Disable dynamic backend" FORCE)
    +add_subdirectory(depend/llama)
    +# Restore shared build for vision.cpp
    +set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_SAVED})
    +
     # Installation
     
     set(VISP_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files")

    and visp/CMakeLists.txt

    --- vcpp-CMakeLists.txt	2026-02-02 17:18:42.666143249 +0000
    +++ vcpp-CMakeLists.patch.txt	2026-02-09 22:26:29.711088653 +0000
    @@ -25,8 +25,7 @@
     )
     target_link_options(visioncpp PRIVATE ${VISP_LINK_OPTIONS})
     target_link_libraries(visioncpp
    -  PUBLIC ggml
    -  PRIVATE stb ${VISP_FMT_LINK}
    +  PRIVATE llama stb ${VISP_FMT_LINK}
     )
     # set_target_properties(visioncpp PROPERTIES
     #   VERSION ${PROJECT_VERSION}

    I still need to make a package, install it and test but don't see any major challenges. I may maintain a shared version and a static version but set set conficts(llama) in the shared version.

  4. Acly commented on Feb 10, 2026

    @Acly
    Owner

    Static build for ggml/ggml-base makes sense, I have to try it still, but wouldn't mind making it the default.

    For the backends (GGML_BACKEND_DL) I think it would still make sense to keep dynamic loading. These are not linked at compile time, so they don't need to be on the linker path. Rather ggml tries to dynamically load them at runtime, so it just needs to know where to find them and they can be anywhere.

    The advantage to keeping the backends dynamic is that people without Vulkan installed (maybe no GPU in the system) can still load and use the library, which would not be possible if the Vulkan backend is statically linked into libvisioncpp. Same for CPU if the minimum instruction set (currently AVX for x86) is not supported.

    Running cli globally would fail to find the default models if they were in a $HOME folder for users logged in with accounts other than that of the installer so I try to keep dependencies of global applications in global locations; that is why I was minded to put the default models in /usr/share/vision.cpp/models when packaging.

    Definitely install models that ship with the package into the system location. I was thinking of users downloading alternative models eg. there are more precise high-res versions of BiRefNet, but they're more heavy-weight. Having a search path with fallbacks would allow these to co-exist.

  5. Timh1970 commented on Feb 10, 2026

    @Timh1970
    Author

    It will probably be easier to maintain packages with without Vulkan separately; I am still very much experimenting and seeing what works for now.

    My rig is not well suited to running on cpu (it's ancient). It does work, but in tests it took on a large file (which I use to try and punish it) it took 9 minuted to process and the cooling fans went for it. Same file with Vulkan took 20 seconds on an old AMD RX 580; on a more sensible file I am getting around 390ms. Interestingly on a nvidia RTX4060 the large file makes it fall over; but that is an nvidia issue as it doesn't manage memory as well (sensible file works okay and runs inference in around 70ms); both tested with BiRefNet-dynamic-F16

    Definitely install models that ship with the package into the system location. I was thinking of users downloading alternative models eg. there are more precise high-res versions of BiRefNet, but they're more heavy-weight. Having a search path with fallbacks would allow these to co-exist.

    Yes, I use BiRefNet dynamic ordinarily but the cli is a great little convenience for quick testing and to give a rough idea of what each model does.

    I will have a go at compiling with GGML_BACKEND_DL dynamic and then do some tests to see what happens.

  6. Timh1970 commented on Feb 10, 2026

    @Timh1970
    Author

    Is there any chance you can do a 0.3.1 tag so I can play with my patches? I did a dumb thing and both packaged and made patches without a tag.

  7. Acly commented on Feb 10, 2026

    @Acly
    Owner

    Not really sure why it's important, but okay: https://github.com/Acly/vision.cpp/tree/v0.3.1

    don't think it'll confuse anybody at this point

  8. Timh1970 commented on Feb 11, 2026

    @Timh1970
    Author

    Normally I would just download a release tarball but couldn't do that because sub modules aren't in the tarball so I have to clone it instead. If a line of code changes in any of the files that I have patched then I need to redo the patches. I can't use the normal source() directive in PKGBUILD because --recursive is not supported (I always build on Arch first because it has the one of the easiest way to build in a chroot environments, then move on to the more challenging distros later). Instead I need to git clone --recursive --branch v0.3.1 [https://](https://github.com/Acly/vision.cpp Building against a branch will mean that the patches will always work regardless of how many changes are made.

    Once everything tests out okay you can decide what (if anything) you wish to incorporate and I can merge the changes with any remaining patches on the next tag.

    I messed up because I should have included the --branch v0.3.0 but a few changes have been made since then so when I remembered it was too late (I either re did the patches or got a new tag).

    I have amended the patches for the CMakeLists as I messed up a bit and it only showed up when I built in a chroot.

    src/visp/CMakeLists.txt

    --- a/vision.cpp/src/visp/CMakeLists.txt	2026-02-10 22:21:27.011962744 +0000
    +++ b/vision.cpp/src/visp/CMakeLists.txt	2026-02-10 23:32:54.765315012 +0000
    @@ -25,8 +25,8 @@
     )
     target_link_options(visioncpp PRIVATE ${VISP_LINK_OPTIONS})
     target_link_libraries(visioncpp
    -  PUBLIC ggml
    -  PRIVATE stb ${VISP_FMT_LINK}
    +  PUBLIC ggml::ggml
    +  PRIVATE llama stb ${VISP_FMT_LINK}
     )
     # set_target_properties(visioncpp PROPERTIES
     #   VERSION ${PROJECT_VERSION}

    root/CMakeLists.txt

    --- a/vision.cpp/CMakeLists.txt	2026-02-02 17:18:42.662809881 +0000
    +++ b/vision.cpp/CmakeLists.txt	2026-02-10 22:57:27.524971901 +0000
    @@ -85,9 +85,12 @@
     endif()
     
     # Dependencies
    +set(CMAKE_POSITION_INDEPENDENT_CODE ON)
    +
     
     add_subdirectory(depend/stb)
     
    +
     if(VISP_FMT_LIB)
       add_subdirectory(depend/fmt)
       set(VISP_FMT_LINK fmt::fmt)
    @@ -109,15 +112,22 @@
         endforeach()
       endif()
     endif()
    -add_subdirectory(depend/llama/ggml)
     
    -# Vision.cpp libraries and executables
    +# Save and force static build for llama
    +set(BUILD_SHARED_LIBS_SAVED ${BUILD_SHARED_LIBS})
    +set(BUILD_SHARED_LIBS OFF)
    +set(LLAMA_STATIC ON CACHE BOOL "Build llama as static" FORCE)
    +set(GGML_STATIC ON CACHE BOOL "Build ggml as static" FORCE)
    +set(GGML_BACKEND_DL OFF CACHE BOOL "Disable dynamic backend" FORCE)
    +add_subdirectory(depend/llama)
    +# Restore shared build for vision.cpp
    +set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_SAVED})
     
    +# Vision.cpp libraries and executables
     add_subdirectory(src/visp)
     add_subdirectory(src/cli)
     
     # Tests
    -
     if(VISP_TESTS)
       enable_testing()
       add_subdirectory(tests)
    @@ -125,7 +135,6 @@
     endif()
     
     # Installation
    -
     set(VISP_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files")
     set(VISP_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files")
     set(VISP_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Location of binary files")

    The PKGBUILD lets CMake do the installing and then strips out the archives and unnecessary headers afterwards for the static build to avoid conflicts.

    pkgname=vision.cpp-vulkan-static-git
    pkgver=0.3.1
    pkgrel=13
    pkgdesc="Computer Vision ML inference in C++"
    arch=(x86_64)
    license=('MIT')
    depends=('shaderc' 'vulkan-headers' 'vulkan-icd-loader' 'vulkan-validation-layers' 'spirv-headers' 'spirv-tools' 'vulkan-tools' 'vulkan-utility-libraries' 'vulkan-validation-layers' 'vulkan-extra-tools' 'vulkan-extra-layers')
    makedepends=('git' 'cmake') 
    options=('staticlibs')
    source=(
      "vision.cpp-cli-CmakeLists.txt.patch"
      "vision.cpp-cli.cpp.patch"
      "vision.cpp-root-CMakeLists.txt.patch"
      "vision.cpp-visp-CMakeLists.txt.patch"
    )
    noextract=()
    sha256sums=('c8449fba4f4211e22ba1c75a02ba732f33ae5eb6a57c6c831c8d58906f1920d9'
                'ba70b02cda1b8467d27d8fdba4e4910c29c336a1b2f23ea8cebc9af74e02f7a3'
                'db718372ef83fc873bbe4818c1d05712822f79a9df4e37feb4db907267a9d675'
                'c181c07701e6257e68cc284a15bed146227e28bed1243f929bc8cca83549093f')
    
    prepare() {
      cd "$srcdir"
      git clone --recursive --branch v0.3.1 https://github.com/Acly/vision.cpp
    }
    
    build() {
    
      patch -p1 < "$srcdir/vision.cpp-cli-CmakeLists.txt.patch"
      patch -p1 < "$srcdir/vision.cpp-cli.cpp.patch"
      patch -p1 < "$srcdir/vision.cpp-root-CMakeLists.txt.patch"
      patch -p1 < "$srcdir/vision.cpp-visp-CMakeLists.txt.patch"
    
    
      cd "$srcdir/vision.cpp"
    
      cmake -B build \
        -DCMAKE_INSTALL_PREFIX=/usr \
        -DCMAKE_BUILD_TYPE=Release \
        -DVISP_VULKAN=ON \
        -DMODEL_PATH="/usr/share/vision.cpp/models"
    
      cmake --build build
    }
    
    package() {
      cd "$srcdir/vision.cpp"
      DESTDIR="$pkgdir" cmake --install build
      models=("${srcdir}/vision.cpp/models/"*.gguf)
      install -Dm644 -t "$pkgdir/usr/share/vision.cpp/models" "${models[@]}"
      rm "${pkgdir}/usr/include/"*.h
      rm -R "${pkgdir}/usr/lib/cmake/llama"
      rm -R "${pkgdir}/usr/lib/cmake/ggml"
      rm "${pkgdir}/usr/lib/"*.a
    }
  9. Acly commented on Feb 11, 2026

    @Acly
    Owner

    made some changes: #20

    not sure I got it all, but this should allow you to do

      cmake -B build \
        -DCMAKE_INSTALL_PREFIX=/usr \
        -DCMAKE_BUILD_TYPE=Release \
        -DVISP_VULKAN=ON \
        -DVISP_INSTALL_MODELS=ON \
        -DVISP_STATIC_GGML=ON \
        -DVISP_TESTS=OFF
    

    and it will install models to /usr/share/visioncpp (as part of cmake --install) and cli will find them there

    I've only done a bit of testing on windows so far

    NB: this will not install any ESRGAN model, the one downloaded for tests is not really suitable. but now we could define a more generalist upscaler instead that comes with VISP_INSTALL_MODELS but not VISP_TESTS.

  10. Timh1970 commented on Feb 11, 2026

    @Timh1970
    Author

    Ooooh so close it isn't even worth writing a patch for. Building on the mode-install-path branch gives me

    /usr/bin/ld: ../../lib/libggml-vulkan.a(ggml-vulkan.cpp.o): warning: relocation against `log_f32_rte_data' in read-only section `.text'
    /usr/bin/ld: ../../lib/libggml.a(ggml-backend-reg.cpp.o): relocation R_X86_64_PC32 against symbol `_ZN21ggml_backend_registryD1Ev' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/ld: final link failed: bad value
    collect2: error: ld returned 1 exit status
    make[2]: *** [src/visp/CMakeFiles/visioncpp.dir/build.make:301: lib/libvisioncpp.so] Error 1
    make[1]: *** [CMakeFiles/Makefile2:470: src/visp/CMakeFiles/visioncpp.dir/all] Error 2
    make: *** [Makefile:156: all] Error 2

    Which is kind of self explanatory.

    Line 109 insert 'set(CMAKE_POSITION_INDEPENDENT_CODE ON)` and it compiles.

    I will have to do a bit of deeper testing in a couple of days but on the face of it that looks great.

    PS. I am afraid that the best I can manage is to fumble around when it comes to CMake but that looks like a much cleaner solution more elegant solution than mine.

    I don't have time to do a full test right now but at a glance I think you might need to put a leading / in VISP_MODEL_INSTALL_DIR as I have a feeling without it it will resolve to /usrshare.

  11. Acly commented on Feb 11, 2026

    @Acly
    Owner

    Ah I was thinking "I will put PIC in a separate commit" and then forgot.

    I don't have time to do a full test right now but at a glance I think you might need to put a leading / in VISP_MODEL_INSTALL_DIR as I have a feeling without it it will resolve to /usrshare.

    I think for installing it should be fine, but there's an issue when passing it to CLI since VISP_MODEL_INSTALL_DIR is typically a path relative to CMAKE_INSTALL_PREFIX (ie. just "share/visioncpp"). The install command concatenates them and makes "/usr/share/visioncpp", but need to do the same manually for the CLI definition.

    Should be fixed now on the branch.

  12. Timh1970 commented on Feb 18, 2026

    @Timh1970
    Author

    So far all seems good (good enough to continue at least). I haven't done exhaustive tests as my workload just got silly, but in principle all is good.

    I am thinking now that this works well enough for my use case, but it makes sense now we have gone this far to do it properly if you like.

    Next thing would be to make it ABI friendly (and I have no idea how to do that in Cmake, but it can't be that hard) Were it an ordinary makefile then you would:

    MAJOR := $(major)
    MINOR := $(minor)
    PATCH := $(patch)
    VERSION := $(MAJOR).$(MINOR).$(PATCH)
    APPLICATION=xxxxxxxxxxxxx.so
    FULLNAME = $(APPLICATION).$(VERSION)
    SONAME = $(APPLICATION).$(MAJOR)
    
    SOURCES = $(wildcard *.cpp)
    HEADERS = $(wildcard *.h)
    OBJECTS = $(SOURCES:.cpp=.o)
    
    CXX = g++
    USER_CXXFLAGS ?=
    CXXFLAGS += ....
    
    
    $(FULLNAME): $(OBJECTS)
    	$(CXX) -shared -Wl,-soname,$(SONAME) -o $@ $^
    	ln -sfT $(FULLNAME) $(SONAME)
    	ln -sfT $(SONAME) $(APPLICATION)
    
    %.o: %.cpp $(HEADERS)
    	$(CXX) $(CXXFLAGS) -c $< -o $@
    
    .PHONY: install
    install:
    
    	install -Dm755 -t $(DESTDIR)/usr/lib/ $(FULLNAME)
    	ln -sfT $(FULLNAME) $(DESTDIR)/usr/lib/$(SONAME)
    	ln -sfT $(SONAME)   $(DESTDIR)/usr/lib/$(APPLICATION)
    
    ...

    This gives you a libvisioncpp.so.0.3.0 file and a couple of symlinks to libvisioncpp.so.0 and libvisioncpp.so; which is enough to package it for Debian based distros (ish).

  13. Timh1970 commented on Feb 28, 2026

    @Timh1970
    Author

    It turns out making the ABI compliant library is easier than it looks

    --- CMakeLists.txt.orig
    +++ CMakeLists.txt
    @@ -107,6 +107,14 @@
     # Vision.cpp libraries and executables
     
     add_subdirectory(src/visp)
    +
    +# Set ABI versioning for the shared library
    +if(TARGET visioncpp)
    +  set_target_properties(visioncpp PROPERTIES
    +    VERSION ${PROJECT_VERSION}
    +    SOVERSION ${PROJECT_VERSION_MAJOR}
    +  )
    +endif()
    +
     add_subdirectory(src/cli)

    While you are at it, if you could create a visioncpp.pc.in file in the project root

    prefix=@CMAKE_INSTALL_PREFIX@
    exec_prefix=${prefix}
    libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
    includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
    
    Name: visioncpp
    Description: Computer Vision ML inference in C++
    Version: @PROJECT_VERSION@
    Libs: -L${libdir} -lvisioncpp
    Cflags: -I${includedir}

    and add this to the bottom of the CMakeLists.txt file so that it is installed in the right place, that would be fantastic.

    # --- ABI Versioning and pkg-config Standardisation ---
    
    if(TARGET visioncpp)
      # Sets libvisioncpp.so.0 and symlinks for ABI compliance
      set_target_properties(visioncpp PROPERTIES
        VERSION ${PROJECT_VERSION}
        SOVERSION ${PROJECT_VERSION_MAJOR}
      )
    
      # Generate and Install pkg-config file
      configure_file(
        "${CMAKE_CURRENT_SOURCE_DIR}/visioncpp.pc.in"
        "${CMAKE_CURRENT_BINARY_DIR}/visioncpp.pc"
        @ONLY
      )
    
      install(
        FILES "${CMAKE_CURRENT_BINARY_DIR}/visioncpp.pc"
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
      )
    endif()
  14. Acly commented on Mar 2, 2026

    @Acly
    Owner

    I commented out SO version at some point, it was causing issues in some case, have to recheck. But it should be solvable somehow.

  15. Acly commented on Mar 2, 2026

    @Acly
    Owner

    Yea seems to work fine.

    Something else I noticed:

    • The static ggml libraries currently get installed into the package too. It's not so easy to avoid, so probably you just want to filter them out.
    • Likewise lib/cmake/ggml gets installed, but should probably not be packaged
    • But if consumers of the library can't link ggml, can they use libvisioncpp?

    The library was never meant to be a sealed layer around ggml, but rather something that can be used alongside. Parts of it can be used as building blocks for bigger ggml graphs. I'll try to do some testing with an example project that consumes the package with statically built ggml without linking it. Maybe with little effort the "high-level API" can work like that. And the rest is not so important for now (IMO people who are interested in that would include the lib as part of their source-tree anyway, not link a system package).

  16. Timh1970 commented on Mar 2, 2026

    @Timh1970
    Author

    The issue might have been something to do with position independent code not being enabled previously, but that is resolved already so with any luck everything will work okay. One thing that might have broken is the python bindings; I am no expert but it looks like _lib.py is looking for an unversioned .so

    Try something like

        else:  # assume Linux / Unix
            prefix = "lib"
            # Try both the versioned and unversioned suffix
            suffixes = [".so.0", ".so"] 
            libdir = "lib"
        
        # ... then in the loop ...
        for sfx in suffixes:
            libname = f"{prefix}visioncpp{sfx}"
            # (Rest of the path-searching logic)
  17. Acly commented on Mar 3, 2026

    @Acly
    Owner

    Why should there be a problem with python? The unversioned .so is still there as symlink.

    I think the pkgconfig will not work for now, consuming the lib currently requires ggml, which will conflict.

    It can be done in the future, either just making a C API available that does not require ggml, or by aligning with upstream.

  18. Timh1970 commented on Mar 3, 2026

    @Timh1970
    Author

    I am not sure how much you know about it so forgive me if I am sounding a bit patronising, but the Debian and Fedora/Red Hat way is to take a perfectly good sensible package and split it into 3 parts.

    • Binary - the cli
    • libvisioncpp0 - the library on its own; this will include libvisioncpp.so.0.3.1 and a symlink to libvisioncpp.so.0. libvisioncpp.so.0 is basically the gateway for binaries like cli
    • libvisioncpp-dev - This is the development package containing the headers and the symlink libvisioncpp.so that is only installed by developers who explicitly wish to build against the library. Unless you have the -dev package libvisioncpp.so won't exist on the system.

    Arch style distros don't care, you just bundle the lot together in a single package but Debian and Fedora/Red hat do.

    One other little tweak I forgot about was the lib dir varies across distros, but thankfully Cmake automates this if you add this near the top:

    include(GNUInstallDirs)
    

    Then update the install command to this:

    install(TARGETS visioncpp
      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    )
    

    And I think that is it, one way or another that should be sufficient to package it on every distro.

  19. Acly commented on Mar 3, 2026

    @Acly
    Owner

    but the Debian and Fedora/Red Hat way is to take a perfectly good sensible package and split it into 3 parts.

    This should work out, we just don't do libvisioncpp-dev for now (and exclude the respective part in arch too).

    Python I would also exclude - it's usually distributed via PyPi and self-contained.

    but thankfully Cmake automates this if you add this near the top:

    This is already there (the VISP_* versions are initialized with those variables).

  20. Timh1970 commented on Mar 3, 2026

    @Timh1970
    Author

    This is already there (the VISP_* versions are initialized with those variables).

    My apologies, I missed it somehow.

    This should work out, we just don't do libvisioncpp-dev for now (and exclude the respective part in arch too).
    Python I would also exclude - it's usually distributed via PyPi and self-contained.

    That should be fine; If I exclude python then doing the -dev package really isn't an issue as it is just split by the .install files inside the debian folder; as it is the first go, it is very much a make it and see what breaks thing at this stage so nothing is set in stone.

    I just want to put a template together and see what lintian throws at me and whether it generates all the necessary symbols; Debian has a habit of deciding "Oh you don't need that I will just leave it out!", which inevitably leads to a 2 day fight with conflicting linker flags when it builds perfectly but you can't run anything built against it because of a missing symbol for a random constructor.

  21. Acly commented on Mar 3, 2026

    @Acly
    Owner

    Okay, merged the changes.

    If I exclude python then doing the -dev package really isn't an issue

    Just keep in mind that to build anything against libvisioncpp the (static) ggml libs and include files are still needed, but they should not be installed into global folders like /usr/lib or /use/include to avoid clash with "official" libggml packages.

  22. Timh1970 commented on Mar 3, 2026

    @Timh1970
    Author

    Just keep in mind that to build anything against libvisioncpp the (static) ggml libs and include files are still needed, but they should not be installed into global folders like /usr/lib or /use/include to avoid clash with "official" libggml packages.

    Got it; I remove the ggml archive and includes as part of the post installation as they are not needed due to the archive being baked in. I did note however that the archive is still exposing its symbols however also noted that it looks like you already prepared to hide them away so I just did.

    set(CMAKE_CXX_VISIBILITY_PRESET hidden)
    set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)

    Alt the top of your CMakelists.txt and

    if(UNIX AND NOT APPLE)
        target_link_options(visioncpp PRIVATE "-Wl,--exclude-libs,ALL")
    endif()
    

    At the bottom and now it is clean so you should be able to install anything alongside it with impunity; these are all that are exposed now and preliminary testing with the built in cli implies it works as expected with no ggml symbols exposed at all.

    000000000008abc0 T visp_backend_load_all
    000000000008ad20 T visp_device_description
    000000000008ac80 T visp_device_destroy
    000000000008abe0 T visp_device_init
    000000000008ace0 T visp_device_name
    000000000008acd0 T visp_device_type
    000000000008ab50 T visp_get_last_error
    000000000008ab70 T visp_image_destroy
    000000000008b8a0 T visp_model_compute
    000000000008afc0 T visp_model_destroy
    000000000008ad60 T visp_model_detect_family
    000000000008ae00 T visp_model_load
    000000000008dd70 T _ZN4visp10image_blurERKNS_10image_viewERKNS_10image_spanEi
    0000000000096fa0 T _ZN4visp10image_loadEPKc
    0000000000096f20 T _ZN4visp10image_saveERKNS_10image_viewEPKc
    000000000008d420 T _ZN4visp10image_spanC1ENS_4vec2IiEENS_12image_formatEPf
    000000000008d420 T _ZN4visp10image_spanC1ENS_4vec2IiEENS_12image_formatEPh
    000000000008d460 T _ZN4visp10image_spanC1ENS_4vec2IiEENS_12image_formatESt4spanIhLm18446744073709551615EE
    000000000008d4c0 T _ZN4visp10image_spanC1ENS_4vec2IiEESt4spanIfLm18446744073709551615EE
    000000000008d520 T _ZN4visp10image_spanC1ENS_4vec2IiEESt4spanINS_4vec3IfEELm18446744073709551615EE
    000000000008d580 T _ZN4visp10image_spanC1ENS_4vec2IiEESt4spanINS_4vec4IfLm16EEELm18446744073709551615EE
    000000000008d4b0 T _ZN4visp10image_spanC1ERNS_10image_dataE
    000000000008d420 T _ZN4visp10image_spanC2ENS_4vec2IiEENS_12image_formatEPf
    000000000008d420 T _ZN4visp10image_spanC2ENS_4vec2IiEENS_12image_formatEPh
    000000000008d460 T _ZN4visp10image_spanC2ENS_4vec2IiEENS_12image_formatESt4spanIhLm18446744073709551615EE
    000000000008d4c0 T _ZN4visp10image_spanC2ENS_4vec2IiEESt4spanIfLm18446744073709551615EE
    000000000008d520 T _ZN4visp10image_spanC2ENS_4vec2IiEESt4spanINS_4vec3IfEELm18446744073709551615EE
    000000000008d580 T _ZN4visp10image_spanC2ENS_4vec2IiEESt4spanINS_4vec4IfLm16EEELm18446744073709551615EE
    000000000008d4b0 T _ZN4visp10image_spanC2ERNS_10image_dataE
    000000000008d280 T _ZN4visp10image_viewC1ENS_4vec2IiEENS_12image_formatEPKf
    000000000008d280 T _ZN4visp10image_viewC1ENS_4vec2IiEENS_12image_formatEPKh
    000000000008d3b0 T _ZN4visp10image_viewC1ENS_4vec2IiEENS_12image_formatESt4spanIKhLm18446744073709551615EE
    000000000008d310 T _ZN4visp10image_viewC1ENS_4vec2IiEESt4spanIKfLm18446744073709551615EE
    000000000008d340 T _ZN4visp10image_viewC1ENS_4vec2IiEESt4spanIKNS_4vec3IfEELm18446744073709551615EE
    000000000008d370 T _ZN4visp10image_viewC1ENS_4vec2IiEESt4spanIKNS_4vec4IfLm16EEELm18446744073709551615EE
    000000000008d2c0 T _ZN4visp10image_viewC1ERKNS_10image_dataE
    000000000008d2d0 T _ZN4visp10image_viewC1ERKNS_10image_spanE
    000000000008d280 T _ZN4visp10image_viewC2ENS_4vec2IiEENS_12image_formatEPKf
    000000000008d280 T _ZN4visp10image_viewC2ENS_4vec2IiEENS_12image_formatEPKh
    000000000008d3b0 T _ZN4visp10image_viewC2ENS_4vec2IiEENS_12image_formatESt4spanIKhLm18446744073709551615EE
    000000000008d310 T _ZN4visp10image_viewC2ENS_4vec2IiEESt4spanIKfLm18446744073709551615EE
    000000000008d340 T _ZN4visp10image_viewC2ENS_4vec2IiEESt4spanIKNS_4vec3IfEELm18446744073709551615EE
    000000000008d370 T _ZN4visp10image_viewC2ENS_4vec2IiEESt4spanIKNS_4vec4IfLm16EEELm18446744073709551615EE
    000000000008d2c0 T _ZN4visp10image_viewC2ERKNS_10image_dataE
    000000000008d2d0 T _ZN4visp10image_viewC2ERKNS_10image_spanE
    0000000000098a90 T _ZN4visp10model_initEm
    000000000009a070 T _ZN4visp10model_loadEPKc
    000000000008d0e0 T _ZN4visp10n_channelsENS_12image_formatE
    000000000008d2f0 T _ZN4visp10n_channelsERKNS_10image_viewE
    000000000009d7a0 T _ZN4visp10sam_encodeERNS_9sam_modelENS_10image_viewE
    0000000000091ae0 T _ZN4visp10tile_mergeERKNS_10image_viewERKNS_10image_spanENS_4vec2IiEERKNS_11tile_layoutE
    0000000000091940 T _ZN4visp10tile_scaleERKNS_11tile_layoutEi
    000000000008d690 T _ZN4visp11image_allocENS_4vec2IiEENS_12image_formatE
    000000000008d6e0 T _ZN4visp11image_clearERKNS_10image_spanE
    0000000000096eb0 T _ZN4visp11image_scaleERKNS_10image_viewENS_4vec2IiEE
    0000000000096d50 T _ZN4visp11image_scaleERKNS_10image_viewENS_4vec2IiEERKNS_10image_spanE
    0000000000099630 T _ZN4visp11interpolateERKNS_9model_refEP11ggml_tensorNS_4vec2IlEEi
    000000000009e190 T _ZN4visp11sam_computeERNS_9sam_modelENS_4vec2IiEE
    000000000009e1d0 T _ZN4visp11sam_computeERNS_9sam_modelENS_6box_2dE
    0000000000089e70 T _ZN4visp11swin_encodeENS_9model_refEP11ggml_tensorRKNS_11swin_paramsE
    0000000000099010 T _ZN4visp11tensor_data6as_f32Ev
    0000000000099050 T _ZN4visp11tensor_data6as_i32Ev
    0000000000099090 T _ZN4visp11tensor_data8as_bytesEv
    000000000009a160 T _ZN4visp11tensor_loadEP11ggml_tensorPKc
    000000000009a210 T _ZN4visp11tensor_saveEP11ggml_tensorPKc
    00000000000918b0 T _ZN4visp11tile_layoutC1ENS_4vec2IiEEiii
    00000000000918b0 T _ZN4visp11tile_layoutC2ENS_4vec2IiEEiii
    000000000009a650 T _ZN4visp12backend_initENS_12backend_typeE
    000000000009a2b0 T _ZN4visp12backend_initEv
    0000000000098ff0 T _ZN4visp12tensor_allocEP11ggml_tensor
    0000000000090d70 T _ZN4visp13image_erosionERKNS_10image_viewERKNS_10image_spanEi
    000000000008d950 T _ZN4visp13image_to_maskERKNS_10image_viewE
    000000000008d760 T _ZN4visp13image_to_maskERKNS_10image_viewERKNS_10image_spanE
    000000000009f260 T _ZN4visp13migan_computeERNS_11migan_modelENS_10image_viewES2_
    000000000009f840 T _ZN4visp14esrgan_computeERNS_12esrgan_modelENS_10image_viewE
    0000000000080100 T _ZN4visp14migan_generateENS_9model_refEP11ggml_tensorRKNS_12migan_paramsE
    0000000000098b00 T _ZN4visp14model_allocateERNS_13model_weightsERKNS_14backend_deviceE
    000000000009b5b0 T _ZN4visp14model_transferERKNS_10model_fileERNS_13model_weightsERKNS_14backend_deviceE9ggml_typeNS_18tensor_data_layoutE
    000000000009a760 T _ZN4visp14model_transferERKP12ggml_contextRNS_13model_weightsERKNS_14backend_deviceE9ggml_typeNS_18tensor_data_layoutESA_St4spanIKiLm18446744073709551615EE
    0000000000086b50 T _ZN4visp14sam_encode_boxENS_9model_refEP11ggml_tensor
    000000000009d520 T _ZN4visp14sam_load_modelEPKcRKNS_14backend_deviceE
    000000000007b050 T _ZN4visp15esrgan_generateENS_9model_refEP11ggml_tensorRKNS_13esrgan_paramsE
    0000000000094810 T _ZN4visp15image_f32_to_u8ERKNS_10image_viewENS_12image_formatEff
    0000000000092360 T _ZN4visp15image_f32_to_u8ERKNS_10image_viewERKNS_10image_spanEff
    0000000000091820 T _ZN4visp15image_normalizeERKNS_10image_viewEff
    0000000000091190 T _ZN4visp15image_normalizeERKNS_10image_viewERKNS_10image_spanEff
    000000000008d9c0 T _ZN4visp15image_set_alphaERKNS_10image_spanERKNS_10image_viewE
    0000000000096860 T _ZN4visp15image_u8_to_f32ERKNS_10image_viewENS_12image_formatENS_4vec4IfLm16EEES5_
    0000000000095b10 T _ZN4visp15image_u8_to_f32ERKNS_10image_viewERKNS_10image_spanENS_4vec4IfLm16EEES7_NS_4vec2IiEE
    0000000000085410 T _ZN4visp15sam_process_boxENS_6box_2dENS_4vec2IiEERKNS_10sam_paramsE
    000000000008a0e0 T _ZN4visp15swin_precomputeENS_9model_refENS_4vec2IiEERKNS_11swin_paramsE
    000000000009e520 T _ZN4visp16birefnet_computeERNS_14birefnet_modelENS_10image_viewE
    00000000000646c0 T _ZN4visp16birefnet_predictENS_9model_refEP11ggml_tensorRKNS_15birefnet_paramsE
    000000000009ec50 T _ZN4visp16depthany_computeERNS_14depthany_modelENS_10image_viewE
    0000000000077f30 T _ZN4visp16depthany_predictENS_9model_refEP11ggml_tensorRKNS_15depthany_paramsE
    000000000009efc0 T _ZN4visp16migan_load_modelEPKcRKNS_14backend_deviceE
    0000000000086c10 T _ZN4visp16sam_encode_imageENS_9model_refEP11ggml_tensorRKNS_10sam_paramsE
    0000000000086d50 T _ZN4visp16sam_predict_maskENS_9model_refEP11ggml_tensorS2_
    00000000000854a0 T _ZN4visp16sam_process_maskESt4spanIKfLm18446744073709551615EEiNS_4vec2IiEERKNS_10sam_paramsE
    000000000009f5b0 T _ZN4visp17esrgan_load_modelEPKcRKNS_14backend_deviceE
    0000000000086a90 T _ZN4visp17sam_encode_pointsENS_9model_refEP11ggml_tensor
    0000000000085190 T _ZN4visp17sam_process_inputENS_10image_viewERKNS_10sam_paramsE
    0000000000085390 T _ZN4visp17sam_process_pointENS_4vec2IiEES1_RKNS_10sam_paramsE
    0000000000098cc0 T _ZN4visp18compute_graph_initEm
    0000000000079d20 T _ZN4visp18dino_detect_paramsERKNS_10model_fileE
    0000000000088940 T _ZN4visp18swin_detect_paramsERKNS_10model_fileE
    000000000009e210 T _ZN4visp19birefnet_load_modelEPKcRKNS_14backend_deviceE
    0000000000064d20 T _ZN4visp19birefnet_precomputeENS_9model_refERKNS_15birefnet_paramsE
    0000000000098f70 T _ZN4visp19compute_graph_inputERKNS_9model_refE9ggml_typeNS_4vec4IlLm8EEENS_12fixed_stringILm64EEE
    000000000009e960 T _ZN4visp19depthany_load_modelEPKcRKNS_14backend_deviceE
    000000000007f450 T _ZN4visp19migan_detect_paramsERKNS_10model_fileE
    000000000007e410 T _ZN4visp19migan_process_inputENS_10image_viewES0_RKNS_12migan_paramsE
    000000000009d430 T _ZN4visp19model_detect_familyERKNS_10model_fileE
    0000000000099170 T _ZN4visp19transfer_to_backendEP11ggml_tensorRKNS_10image_viewE
    0000000000099130 T _ZN4visp19transfer_to_backendEP11ggml_tensorSt4spanIKfLm18446744073709551615EE
    00000000000990f0 T _ZN4visp19transfer_to_backendEP11ggml_tensorSt4spanIKSt4byteLm18446744073709551615EE
    00000000000990d0 T _ZN4visp19transfer_to_backendERKNS_11tensor_dataE
    0000000000098280 T _ZN4visp20backend_is_availableENS_12backend_typeE
    0000000000098fb0 T _ZN4visp20compute_graph_outputERKNS_9model_refEP11ggml_tensorNS_12fixed_stringILm64EEE
    000000000007bb20 T _ZN4visp20esrgan_detect_paramsERKNS_10model_fileE
    0000000000094890 T _ZN4visp20image_difference_rmsERKNS_10image_viewES2_
    000000000007eec0 T _ZN4visp20migan_process_outputESt4spanIKfLm18446744073709551615EENS_4vec2IiEERKNS_12migan_paramsE
    0000000000098930 T _ZN4visp21backend_default_flagsENS_12backend_typeE
    0000000000098820 T _ZN4visp21backend_set_n_threadsERNS_14backend_deviceEi
    0000000000064bd0 T _ZN4visp21birefnet_image_extentENS_4vec2IiEERKNS_15birefnet_paramsEm
    0000000000078240 T _ZN4visp21depthany_image_extentENS_4vec2IiEERKNS_15depthany_paramsE
    0000000000090cf0 T _ZN4visp21image_alpha_compositeERKNS_10image_viewES2_S2_
    00000000000906b0 T _ZN4visp21image_alpha_compositeERKNS_10image_viewES2_S2_RKNS_10image_spanE
    00000000000991b0 T _ZN4visp21transfer_from_backendEP11ggml_tensor
    0000000000099270 T _ZN4visp21transfer_from_backendEP11ggml_tensorRKNS_10image_spanE
    0000000000099220 T _ZN4visp21transfer_from_backendEP11ggml_tensorSt4spanIfLm18446744073709551615EEm
    0000000000065220 T _ZN4visp22birefnet_detect_paramsERKNS_10model_fileENS_4vec2IiEEm
    0000000000064940 T _ZN4visp22birefnet_process_inputENS_10image_viewERKNS_15birefnet_paramsE
    0000000000098d50 T _ZN4visp22compute_graph_allocateERNS_13compute_graphERKNS_14backend_deviceE
    00000000000782b0 T _ZN4visp22depthany_detect_paramsERKNS_10model_fileENS_4vec2IiEE
    0000000000078360 T _ZN4visp22depthany_process_inputENS_10image_viewERKNS_15depthany_paramsE
    0000000000064a90 T _ZN4visp23birefnet_process_outputESt4spanIKfLm18446744073709551615EENS_4vec2IiEERKNS_15birefnet_paramsE
    00000000000784b0 T _ZN4visp23depthany_process_outputESt4spanIKfLm18446744073709551615EENS_4vec2IiEERKNS_15depthany_paramsE
    000000000008f0d0 T _ZN4visp25image_estimate_foregroundERKNS_10image_viewES2_i
    000000000007b6c0 T _ZN4visp26esrgan_estimate_graph_sizeERKNS_13esrgan_paramsE
    0000000000079c80 T _ZN4visp28dino_get_intermediate_layersENS_9model_refEP11ggml_tensorSt4spanIKiLm18446744073709551615EERKNS_11dino_paramsE
    0000000000098f50 T _ZN4visp5namedERKNS_9model_refEP11ggml_tensor
    00000000000992e0 T _ZN4visp5sliceERKNS_9model_refEP11ggml_tensorNS_7slice_tES5_S5_S5_
    00000000000994f0 T _ZN4visp6concatERKNS_9model_refESt5arrayIP11ggml_tensorLm10EEi
    0000000000098dd0 T _ZN4visp7computeERKNS_13compute_graphERKNS_14backend_deviceE
    000000000008d130 T _ZN4visp7n_bytesENS_12image_formatE
    000000000008d3a0 T _ZN4visp7n_bytesERKNS_10image_viewE
    000000000008d120 T _ZN4visp8is_floatENS_12image_formatE
    000000000008d300 T _ZN4visp8n_pixelsERKNS_10image_viewE
    0000000000098e90 T _ZN4visp9model_refC1EP12ggml_contextS2_P11ggml_cgraphNS_5flagsINS_16model_build_flagEEENS_12fixed_stringILm64EEE
    0000000000098de0 T _ZN4visp9model_refC1ERNS_13model_weightsE
    0000000000098e30 T _ZN4visp9model_refC1ERNS_13model_weightsERNS_13compute_graphE
    0000000000098e90 T _ZN4visp9model_refC2EP12ggml_contextS2_P11ggml_cgraphNS_5flagsINS_16model_build_flagEEENS_12fixed_stringILm64EEE
    0000000000098de0 T _ZN4visp9model_refC2ERNS_13model_weightsE
    0000000000098e30 T _ZN4visp9model_refC2ERNS_13model_weightsERNS_13compute_graphE
    0000000000097ee0 T _ZN4visp9to_stringENS_12backend_typeE
    000000000008d5e0 T _ZNK4visp10image_span8as_bytesEv
    000000000008d630 T _ZNK4visp10image_span9as_floatsEv
    000000000008d3d0 T _ZNK4visp10image_view8as_bytesEv
    000000000008d3f0 T _ZNK4visp10image_view9as_floatsEv
    0000000000098a30 T _ZNK4visp10model_file10float_typeEv
    0000000000099f60 T _ZNK4visp10model_file10get_stringEPKc
    000000000009b4a0 T _ZNK4visp10model_file13tensor_layoutEv
    0000000000099f10 T _ZNK4visp10model_file3keyEPKc
    0000000000099f90 T _ZNK4visp10model_file4archEv
    0000000000099fa0 T _ZNK4visp10model_file7get_intEPKc
    0000000000099fc0 T _ZNK4visp10model_file9get_arrayEPKcSt4spanIiLm18446744073709551615EE
    0000000000098a20 T _ZNK4visp10model_file9n_tensorsEv
    0000000000099030 T _ZNK4visp11tensor_data6as_f32Ev
    0000000000099070 T _ZNK4visp11tensor_data6as_i32Ev
    00000000000990b0 T _ZNK4visp11tensor_data8as_bytesEv
    00000000000919d0 T _ZNK4visp11tile_layout3endENS_4vec2IiEES2_
    0000000000091a40 T _ZNK4visp11tile_layout4sizeENS_4vec2IiEE
    0000000000091aa0 T _ZNK4visp11tile_layout5coordEi
    0000000000091990 T _ZNK4visp11tile_layout5startENS_4vec2IiEES2_
    0000000000091a90 T _ZNK4visp11tile_layout5totalEv
    0000000000098c70 T _ZNK4visp13model_weights10float_typeEv
    00000000000987a0 T _ZNK4visp14backend_device12total_memoryEv
    0000000000098780 T _ZNK4visp14backend_device16preferred_layoutEv
    0000000000098730 T _ZNK4visp14backend_device20preferred_float_typeEv
    0000000000098670 T _ZNK4visp14backend_device4typeEv
    00000000000987f0 T _ZNK4visp14backend_device9max_allocEv
    0000000000098ee0 T _ZNK4visp9model_ref11with_prefixENS_12fixed_stringILm64EEE
    000000000009b010 T _ZNK4visp9model_ref4findEPKc
    000000000009b110 T _ZNK4visp9model_ref7weightsEPKc
    0000000000099ad0 T _ZNK4visp9model_refixEi
    000000000009b160 T _ZNK4visp9model_refixENS_12fixed_stringILm64EEE
    0000000000099cf0 T _ZNK4visp9model_refixEPKc
    
  23. Acly commented on Mar 4, 2026

    @Acly
    Owner

    Done, added a VISP_PACKAGE option to make this optional because the python tests need internal symbols to work.

    Setting VISP_PACKAGE=ON will also set VISP_INSTALL_MODELS=ON by default.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions