opencv-rust
opencv-rust copied to clipboard
Build failed on when using diesel crate
The issue arises when I'm by crate with opencv-rust with feature opencv-4. Here is my scenario.
| item | desc |
|---|---|
| OS | Ubuntu 18.04 |
| OpenCV 4 directory | /opt/opencv4.2.0 |
| opencv-rust features | opencv-4,buildtime-bindgen,contrib |
| env vars | PKG_CONFIG_PATH=/opt/opencv4.2.0/lib/pkgconfig, LD_LIBRARY_PATH=/opt/opencv4.2.0/lib |
By calling cargo build [--release], the opencv(build) and opencv pass without errors. When finally reaching to my binary, it failed with the following error.
error: linking with `cc` failed: exit code: 1
|
= note: ... # a very long "cc" command
= note: /usr/bin/ld: warning: libopencv_imgproc.so.4.2, needed by /opt/opencv4.2.0/lib/libopencv_stitching.so, may conflict with libopencv_imgproc.so.3.4
/usr/bin/ld: /mnt/ssd1/aeon/repos/wayside-portal/web/target/release/deps/libopencv-b240c6adf66d7300.rlib(imgproc.o): undefined reference to symbol '_ZN2cv12findContoursERKNS_11_InputArrayERKNS_12_OutputArrayEiiNS_6Point_IiEE'
/opt/opencv4.2.0/lib/libopencv_imgproc.so.4.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
The message includes a long command here.
I see the cause of the problem. The compiler accidentally links to the /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so from Ubuntu repository rather than the desired /opt/opencv4.2.0/lib/libopencv_imgproc.so. It's absolutely the issue of linking order.
I investigate into the erroneous command here. The order turns out to be -L /usr/lib/x86_64-linux-gnu ... -L /opt/opencv4.2.0/lib ... -lopencv_imgproc, so it's expected that the linker picked the one from /usr/lib/x86_64-linux-gnu first. I instructed the cc command with more verbose linker log here, and I confirmed my guess.
Unfortunately, I see no way to manipulate the linking order. Though removing the shipped libopencv-* APT packages on Ubuntu solves the issue, it breaks many other things on a public machine.
Hi, can you please post the opencv4.pc file contents from the /opt/opencv4.2.0/lib/pkgconfig directory?
And also please the output of cargo build -vv --features opencv-4,buildtime-bindgen,contrib
Can you please also check if you experience the same problem with both opencv installations present with a new project with just "opencv" dependency? It might be that this library search path is being injected by another crate.
Interestingly, I have 4 of them linking opencv with same feature set. Only one of them failed.
EDIT:
I think it's not problem of opencv-rust. It's a hard linking order problem that already arises on many build systems. You mess up with -L and rpath. I suppose cargo order the args to native -L -> -L from build.rs. If there are two .so happend to have the same name, you have good luck to pick the desired shared library.
I think a workaround is to use more specific -lopencv_imgproc.4.2.0. It somewhat avoid the problem. However, it cannot tackle with multiple 4.2.0 installations.
Will you be able to track down which dependency adds /usr/lib/x86_64-linux-gnu? My bet would be "diesel" because it's the first crate I can see in the build log which has this linking path in its build arguments.
Turned out you are right. More specifically, it's pq-sys prints the search path. I found it by grepping across target/*/output. Since the root of the problem is not here, we can consider close this issue.
EDIT: typo
Well, yes and no, it’s still a problem with coexisting with other crates so I’d like to investigate if it’s possible to fix it.
I discovered another conflicting issue with tesseract crate. It complains about linking to libclang. It happens specifically with buildtime-bindgen feature. I assume they link to different version of libclang.
Here is the error message.
thread '<unnamed>' panicked at 'a `libclang` shared library is not loaded on this thread', /home/aeon/.cargo/registry/src/github.com-1ecc6299db9ec823/clang-sys-0.28.1/src/lib.rs:1618:1
The env
- Ubuntu 18.04 with
libclang-6.0-devandclang-6.0installed.
Here is the minimal Cargo.toml.
[package]
name = "example"
version = "0.1.0"
authors = ["jerry73204 <[email protected]>"]
edition = "2018"
[dependencies]
opencv = { version = "^0.36.0", default-features = false, features = ["opencv-4", "contrib", "buildtime-bindgen"] }
tesseract = "^0.3.1"
Please use version 0.37.0 and enable clang-runtime feature. This issue has just been fixed.
I've encountered the same error (thread 'main' panicked at 'a libclang shared library is not loaded on this thread') on Windows using bindgen 0.55 and opencv 0.45.
Adding the clang-runtime feature worked for me too.
I'm going to close this issue as it is quite old. If you still experiencing this issue please feel free to reopen.