cblas linker error
hweom opened this issue · comments
Here's my Cargo.toml
:
[dependencies]
coaster = "0.1"
juice = { version = "0.2", default-features = false }
[features]
default = ["native"]
native = ["juice/native"]
And then
$ cargo build
...
error: linking with `cc` failed: exit status: 1
...
= note: /usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/libcoaster_blas-450fb0dd29f3d07a.rlib(coaster_blas-450fb0dd29f3d07a.coaster_blas.72d24db0-cgu.4.rcgu.o): in function `<f32 as rust_blas::vector::ops::Dot>::dot':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/vector/ops.rs:272: undefined reference to `cblas_sdot'
/usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/libcoaster_blas-450fb0dd29f3d07a.rlib(coaster_blas-450fb0dd29f3d07a.coaster_blas.72d24db0-cgu.4.rcgu.o): in function `<f32 as rust_blas::vector::ops::Axpy>::axpy':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/vector/ops.rs:62: undefined reference to `cblas_saxpy'
/usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/libcoaster_blas-450fb0dd29f3d07a.rlib(coaster_blas-450fb0dd29f3d07a.coaster_blas.72d24db0-cgu.4.rcgu.o): in function `<f32 as rust_blas::vector::ops::Copy>::copy':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/vector/ops.rs:28: undefined reference to `cblas_scopy'
/usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/libcoaster_blas-450fb0dd29f3d07a.rlib(coaster_blas-450fb0dd29f3d07a.coaster_blas.72d24db0-cgu.4.rcgu.o): in function `<f32 as rust_blas::vector::ops::Scal>::scal':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/vector/ops.rs:137: undefined reference to `cblas_sscal'
/usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/librust_blas-370727a962638f7d.rlib(rust_blas-370727a962638f7d.rust_blas.9e9a8cb2-cgu.4.rcgu.o): in function `<f32 as rust_blas::matrix::ops::Gemm>::gemm':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/matrix/ops.rs:41: undefined reference to `cblas_sgemm'
collect2: error: ld returned 1 exit status
$ pacman -Q | grep blas
openblas 0.3.18-1
It's interesting that juice examples compile and run just fine...
Did you try setting the env variables as stated in the README?
export BLAS_LIB_DIR=/opt/blas/lib64/
export BLAS_INCLUDE_DIR=/opt/blas/include/
to wherever they end up in your case? blas
is sometimes a bit finicky to get it working.
Note that this is exaserbated since blas
comes with a pkg-config .pc
file, whereas openblas
, at least on fedora 35, does not while cblas
is not available on fedora. But this is precisely the case the env vars exist.
Not sure if I'm doing it right, but here are my steps:
$ sudo pacman -Ql openblas 101 ✘ 10s
openblas /usr/
openblas /usr/include/
openblas /usr/include/f77blas.h
openblas /usr/include/openblas_config.h
openblas /usr/lib/
openblas /usr/lib/cmake/
openblas /usr/lib/cmake/openblas/
openblas /usr/lib/cmake/openblas/OpenBLASConfig.cmake
openblas /usr/lib/cmake/openblas/OpenBLASConfigVersion.cmake
openblas /usr/lib/libblas.so
openblas /usr/lib/libblas.so.3
openblas /usr/lib/libopenblas.so
openblas /usr/lib/libopenblas.so.3
openblas /usr/lib/libopenblasp-r0.3.18.so
openblas /usr/lib/pkgconfig/
openblas /usr/lib/pkgconfig/blas.pc
openblas /usr/lib/pkgconfig/openblas.pc
openblas /usr/share/
openblas /usr/share/licenses/
openblas /usr/share/licenses/openblas/
openblas /usr/share/licenses/openblas/LICENSE
export BLAS_LIB_DIR=/usr/lib/
export BLAS_INCLUDE_DIR=/usr/include/
export BLAS_VARIANT=openblas
cargo clean && cargo build
...
= note: /usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/libcoaster_blas-450fb0dd29f3d07a.rlib(coaster_blas-450fb0dd29f3d07a.coaster_blas.72d24db0-cgu.4.rcgu.o): in function `<f32 as rust_blas::vector::ops::Dot>::dot':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/vector/ops.rs:272: undefined reference to `cblas_sdot'
/usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/libcoaster_blas-450fb0dd29f3d07a.rlib(coaster_blas-450fb0dd29f3d07a.coaster_blas.72d24db0-cgu.4.rcgu.o): in function `<f32 as rust_blas::vector::ops::Axpy>::axpy':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/vector/ops.rs:62: undefined reference to `cblas_saxpy'
/usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/libcoaster_blas-450fb0dd29f3d07a.rlib(coaster_blas-450fb0dd29f3d07a.coaster_blas.72d24db0-cgu.4.rcgu.o): in function `<f32 as rust_blas::vector::ops::Copy>::copy':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/vector/ops.rs:28: undefined reference to `cblas_scopy'
/usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/libcoaster_blas-450fb0dd29f3d07a.rlib(coaster_blas-450fb0dd29f3d07a.coaster_blas.72d24db0-cgu.4.rcgu.o): in function `<f32 as rust_blas::vector::ops::Scal>::scal':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/vector/ops.rs:137: undefined reference to `cblas_sscal'
/usr/bin/ld: /home/mikhail/Documents/evolution/target/debug/deps/librust_blas-370727a962638f7d.rlib(rust_blas-370727a962638f7d.rust_blas.9e9a8cb2-cgu.4.rcgu.o): in function `<f32 as rust_blas::matrix::ops::Gemm>::gemm':
/home/mikhail/.cargo/registry/src/github.com-1ecc6299db9ec823/rust-blas-0.1.3/src/matrix/ops.rs:41: undefined reference to `cblas_sgemm'
collect2: error: ld returned 1 exit status
Thanks for the info, I'll take a look into what's going on here
Note that it easily reproduces with
git clone https://github.com/spearow/juice.git
cd juice
cargo build --release --no-default-features --features "native"
Since I am not a ArchLinux user anymore, could you provide me a container (Containerfile
, Dockerfile
or just a link to a registry) so I can replicate your installed libs?
If I install the package openblas
which removes cblas
, and use your provided env flags
export BLAS_LIB_DIR=/usr/lib/
export BLAS_INCLUDE_DIR=/usr/include/
export BLAS_VARIANT=openblas
it finds openblas
and links juice just fine.
cargo build --release --no-default-features --features "native" -p juice
// snip
Compiling juice v0.3.0 (/x/juice)
warning: `coaster-blas` (lib) generated 56 warnings (49 duplicates)
Finished release [optimized] target(s) in 4.38s
I realized that adding the examples to the repo gives some false positives when compiling the examples, which require cuda right now:
error: linking with `cc` failed: exit status: 1
|
= note: "cc" "-m64" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.0.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.1.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.10.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.11.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.12.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.13.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.14.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.15.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.2.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.3.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.4.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.5.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.6.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.7.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.8.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.example_rnn_regression.f81d7c26-cgu.9.rcgu.o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a.3trdu4z1kglma9yz.rcgu.o" "-Wl,--as-needed" "-L" "/x/target/release/deps" "-L" "/usr/lib64/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/x/target/release/deps/libdocopt-524d597100669d56.rlib" "/x/target/release/deps/libstrsim-47c1da387c04b25a.rlib" "/x/target/release/deps/libenv_logger-69f1b107b026a0d3.rlib" "/x/target/release/deps/libatty-2f6770fc84208eed.rlib" "/x/target/release/deps/libtermcolor-47612503f587db35.rlib" "/x/target/release/deps/libhumantime-29d8c0b2c3ef4a0c.rlib" "/x/target/release/deps/libregex-b95032f6d10cf669.rlib" "/x/target/release/deps/libregex_syntax-99c32f5c08941720.rlib" "/x/target/release/deps/libaho_corasick-f322f133a91a8ecd.rlib" "/x/target/release/deps/libcsv-164bfdf4170c5e44.rlib" "/x/target/release/deps/libryu-b180b1eb79d044ee.rlib" "/x/target/release/deps/libitoa-6175d34776e7b699.rlib" "/x/target/release/deps/libcsv_core-10019def646a9a42.rlib" "/x/target/release/deps/libbstr-ddd3641b469990e1.rlib" "/x/target/release/deps/libregex_automata-94244832ff84c902.rlib" "/x/target/release/deps/libmemchr-34078201487ae117.rlib" "/x/target/release/deps/libjuice-e8fe7b68997d10e0.rlib" "/x/target/release/deps/libcoaster_blas-1d5d028c66910128.rlib" "/x/target/release/deps/librust_blas-166973c7e8652f79.rlib" "/x/target/release/deps/libcapnp-e467e2139bf13fad.rlib" "/x/target/release/deps/libtimeit-5822333272b6ed1e.rlib" "/x/target/release/deps/libtime-4151a6a76d87566d.rlib" "/x/target/release/deps/libserde-603334ed46f247ca.rlib" "/x/target/release/deps/libfs_err-30d1a90a80deead0.rlib" "/x/target/release/deps/libcoaster_nn-26508d680ae518f6.rlib" "/x/target/release/deps/librand-ec1d8659ab00854c.rlib" "/x/target/release/deps/librand_chacha-edbda9611d86292b.rlib" "/x/target/release/deps/libppv_lite86-0bf702597964910b.rlib" "/x/target/release/deps/librand_core-300d3c81fb3dd19a.rlib" "/x/target/release/deps/libgetrandom-30072aa4404bbea2.rlib" "/x/target/release/deps/libcoaster-67218e213fd75c38.rlib" "/x/target/release/deps/librcudnn-d971d7b38e2f5386.rlib" "/x/target/release/deps/librcudnn_sys-2fd6ab6660c2f79e.rlib" "/x/target/release/deps/librcublas-4d89aad957eed906.rlib" "/x/target/release/deps/libthiserror-0a67d38bf3445322.rlib" "/x/target/release/deps/liblog-6c337023950b012a.rlib" "/x/target/release/deps/libcfg_if-c064eaa7abc3d650.rlib" "/x/target/release/deps/librcublas_sys-83c773c08e6051d0.rlib" "/x/target/release/deps/libnum-40ea4ebf302bd9fd.rlib" "/x/target/release/deps/libnum_iter-49661d8d390052e1.rlib" "/x/target/release/deps/libnum_rational-a4afbd387cdf05a8.rlib" "/x/target/release/deps/libnum_complex-1682f0009ea2a353.rlib" "/x/target/release/deps/libnum_bigint-af3970a06d31f990.rlib" "/x/target/release/deps/libnum_integer-e2f2baa18f7b5bf4.rlib" "/x/target/release/deps/libbyteorder-1dcf00b05ddcdb79.rlib" "/x/target/release/deps/liblibc-1830b8a42fb39a31.rlib" "/x/target/release/deps/liblazy_static-ca9d39f825b354e1.rlib" "/x/target/release/deps/libenum_primitive-6950ab977d3cf50f.rlib" "/x/target/release/deps/libnum_traits-03123bd2e5ff531b.rlib" "/x/target/release/deps/libnum_traits-82d981c5cdb489a5.rlib" "/x/target/release/deps/libbitflags-5eebfebe6ed85156.rlib" "-Wl,--start-group" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-1165f94ac1ecb87d.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-a94c82b089904326.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-08da89f6801d2906.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-efd61e674d16f74c.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-8acd4ced312e0e4c.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-b99e1c847bd7b013.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-21f55880014c5032.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-56352f011c73d80e.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-59ef9ea6a9717497.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-0435a75812955b79.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-558037bf295e4d0d.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-6a34e7f699451c36.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-055e710ab7ace102.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-e15536f14cf1b2c5.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-0a4f11dfe00e3e85.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-273ca6e90ef8d9cf.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-ef5d8cbac66e0318.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-93a72d5d18e29f4f.rlib" "-Wl,--end-group" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-0c7e43ac4e512046.rlib" "-Wl,-Bdynamic" "-lopenblas" "-lcuda" "-lcudnn" "-lcudart" "-lcuda" "-lcublas" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-L" "/usr/lib64/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/x/target/release/deps/example_rnn_regression-652e0b9b599c001a" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-Wl,-O1" "-nodefaultlibs"
= note: /usr/sbin/ld: cannot find -lopenblas
/usr/sbin/ld: cannot find -lcuda
/usr/sbin/ld: cannot find -lcudnn
/usr/sbin/ld: cannot find -lcudart
/usr/sbin/ld: cannot find -lcuda
/usr/sbin/ld: cannot find -lcublas
collect2: error: ld returned 1 exit status
warning: `example-rnn-regression` (bin "example-rnn-regression") generated 17 warnings
error: could not compile `example-rnn-regression` due to previous error; 17 warnings emitted
warning: build failed, waiting for other jobs to finish...
error: build failed
[root@fa46cfedb79d x]# cargo build --release --no-default-features --features "native"
it finds openblas and links juice just fine.
juice
is a library, so it wouldn't complain about missing symbols, I think?
I created a Docker image that reproduces the issue:
docker run -it hweom/juice-test
# inside the container
source /root/.profile
cd /opt/juice-test/
cargo build --release
I see.
This is an issue with the provided openblas lib provided in archlinux - it doesn't seem to contain cblas_saxpy
which we need. No idea why.
You are correct, that is only fails if linking with dynamic linkage, I forgot about BLAS_STATIC=1
which I use as much as possible to avoid any breakage like this.
That said, I am not entirely sure how to fix this for you, this either needs a patch to ./rust-blas
contained in the repo, or the archlinux package is busted, upstream contains the required fn https://github.com/xianyi/OpenBLAS/blob/develop/cblas.h#L111
This is probably because it's compiled without CBLAS support: https://github.com/archlinux/svntogit-community/blob/d3a8b289814a2ff9a1974b447a4e8234f32c63df/trunk/PKGBUILD#L23, although I have no idea why.
I'll ask the maintainer, thanks!
Archlinux openblas
package seems to be abandoned. I resolved the issue by switching to AUR's openblas-lapack
. Now it builds without issues.
Thanks for the help!
Could you create a PR with note so other people don't run into the same issue? That'd be much appreciated!
You mean mention this in the Juice README?