lerouxrgd / ngt-rs

Rust wrappers for NGT approximate nearest neighbor search
Apache License 2.0
36 stars 6 forks source link

Can cargo run, can't cargo build #2

Closed paulbricman closed 3 years ago

paulbricman commented 3 years ago

Hi @lerouxrgd,

When using cargo run and cargo run --release, I can use the ngt-rs crate without any issues. Search works and it's really fast. However, when I use cargo build --release and run the binary, I get the following error:

error while loading shared libraries: libngt.so.1: cannot open shared object file: No such file or directory

I'm not sure if this is an issue with ngt-rs, an issue with the underlying NGT, or an issue with my setup. Do you have any thoughts on this?

Ubuntu 18.04, ngt = "0.4.0"

paulbricman commented 3 years ago

The only instances of libngt.so.1 on my machine are build artifacts:

project_root/target/release/build/ngt-sys-7e531d7ff98f0bd6/out/lib/libngt.so.1
project_root/target/release/build/ngt-sys-7e531d7ff98f0bd6/out/build/lib/NGT/libngt.so.1

So I think this is an issue of ngt-rs somehow not using the right libs when building?

lerouxrgd commented 3 years ago

Yes this is expected, the binary built with cargo build does not contain the shared library libngt.so.1. However libngt.so.1 has been built along with your regular binary, you can find it with something like:

find target/release -regex .*out/lib/libngt.*

For the final binary to work properly this libngt.so.1 shared library has to be in LD_LIBRARY_PATH. So something like this should work:

LD_LIBRARY_PATH=/path/to/libngt.so.1 your_binary

Usually shared libraries should be installed in /usr/lib, but it depends on your machine setup. Another way to install it on your machine could be to use cargo install --path . as I assume it would copy libngt.so.1 to the appropriate location on your system (I haven't tried though).

lerouxrgd commented 3 years ago

So in your case you can try:

LD_LIBRARY_PATH="project_root/target/release/build/ngt-sys-7e531d7ff98f0bd6/out/lib/:${LD_LIBRARY_PATH}" project_root

Assuming you are running from project_root and your binary is called project_root

paulbricman commented 3 years ago

It does work this way, thanks for the prompt reply!