How to solve linking problems with manually installed cuda? - c++
I'm trying desperately to get the cuda toolkit running on my debian system, having cuda 11.7 and the nvidia drivers 515 installed via the .run file.
Unfortunately, I always get false when checking for cudart and curand libraries with my autoconf script. Skipping the checks, results in a missing cuda.h error while compiling (c++).
Runing nvcc --version:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Jun__8_16:49:14_PDT_2022
Cuda compilation tools, release 11.7, V11.7.99
Build cuda_11.7.r11.7/compiler.31442593_0
In my ~/.bashrc i added:
export PATH=${PATH}:/usr/local/cuda-11.7/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-11.7/lib64
I also tried to add /usr/local/cuda-11.7/lib64 to ld.so.conf. Runing sudo ldconfig -v | grep cuda gives:
ldconfig: Can't stat /usr/local/cuda-11/targets/x86_64-linux/lib: No such file or directory
ldconfig: Path `/usr/local/cuda-11.7/targets/x86_64-linux/lib' given more than once
ldconfig: Can't stat /usr/local/cuda-11.4/targets/x86_64-linux/lib: No such file or directory
ldconfig: Can't stat /usr/local/lib/x86_64-linux-gnu: No such file or directory
ldconfig: Path `/usr/lib/x86_64-linux-gnu' given more than once
ldconfig: Path `/usr/lib32' given more than once
ldconfig: Path `/usr/local/cuda-11.7/lib64' given more than once
ldconfig: Path `/lib/x86_64-linux-gnu' given more than once
ldconfig: Path `/usr/lib/x86_64-linux-gnu' given more than once
ldconfig: Path `/usr/lib' given more than once
ldconfig: /lib/x86_64-linux-gnu/ld-2.31.so is the dynamic linker, ignoring
/usr/local/cuda/targets/x86_64-linux/lib:
libcudart.so.11.0 -> libcudart.so.11.7.99
libicudata.so.67 -> libicudata.so.67.1
libcuda.so.1 -> libcuda.so.515.65.01
ldconfig: /lib32/ld-2.31.so is the dynamic linker, ignoring
libcuda.so.1 -> libcuda.so.515.65.01
Running sudo ldconfig -p | grep cuda gives the following output:
libnvrtc.so.11.2 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvrtc.so.11.2
libnvrtc.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvrtc.so
libnvrtc-builtins.so.11.7 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvrtc-builtins.so.11.7
libnvrtc-builtins.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvrtc-builtins.so
libnvjpeg.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvjpeg.so.11
libnvjpeg.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvjpeg.so
libnvblas.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvblas.so.11
libnvblas.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvblas.so
libnvToolsExt.so.1 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvToolsExt.so.1
libnvToolsExt.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnvToolsExt.so
libnpps.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnpps.so.11
libnpps.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnpps.so
libnppitc.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppitc.so.11
libnppitc.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppitc.so
libnppisu.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppisu.so.11
libnppisu.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppisu.so
libnppist.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppist.so.11
libnppist.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppist.so
libnppim.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppim.so.11
libnppim.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppim.so
libnppig.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppig.so.11
libnppig.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppig.so
libnppif.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppif.so.11
libnppif.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppif.so
libnppidei.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppidei.so.11
libnppidei.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppidei.so
libnppicc.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppicc.so.11
libnppicc.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppicc.so
libnppial.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppial.so.11
libnppial.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppial.so
libnppc.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppc.so.11
libnppc.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libnppc.so
libicudata.so.67 (libc6,x86-64) => /lib/x86_64-linux-gnu/libicudata.so.67
libicudata.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libicudata.so
libcusparse.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcusparse.so.11
libcusparse.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcusparse.so
libcusolverMg.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcusolverMg.so.11
libcusolverMg.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcusolverMg.so
libcusolver.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcusolver.so.11
libcusolver.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcusolver.so
libcurand.so.10 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcurand.so.10
libcurand.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcurand.so
libcuinj64.so.11.7 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcuinj64.so.11.7
libcuinj64.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcuinj64.so
libcufile_rdma.so.1 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcufile_rdma.so.1
libcufile_rdma.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcufile_rdma.so
libcufile.so.0 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcufile.so.0
libcufile.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcufile.so
libcufftw.so.10 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcufftw.so.10
libcufftw.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcufftw.so
libcufft.so.10 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcufft.so.10
libcufft.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcufft.so
libcudart.so.11.0 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcudart.so.11.0
libcudart.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcudart.so
libcuda.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libcuda.so.1
libcuda.so.1 (libc6) => /lib32/libcuda.so.1
libcuda.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libcuda.so
libcuda.so (libc6) => /lib32/libcuda.so
libcublasLt.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcublasLt.so.11
libcublasLt.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcublasLt.so
libcublas.so.11 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcublas.so.11
libcublas.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libcublas.so
libaccinj64.so.11.7 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libaccinj64.so.11.7
libaccinj64.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libaccinj64.so
libOpenCL.so.1 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libOpenCL.so.1
libOpenCL.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libOpenCL.so
Compilation works fine, when cuda was installed with apt, but I need a newer version than available in apt.
I would be glad, if someone could give me a hint about this. I am relatively new to the Linux world and therefore have problems to fix things myself.
As Fareanor explained, part of the solution was to add cuda to LIBRARY_PATH.
I also had to add cuda to CPATH.
Now it works and .bashrc contains:
export PATH=${PATH}:/usr/local/cuda-11.7/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-11.7/lib64
export LIBRARY_PATH=${LIBRARY_PATH}:/usr/local/cuda-11.7/lib64
export CPATH=$CPATH:/usr/local/cuda/include
Related
Armadillo C++ configuration Check
Is there a way to check the configuration of armadillo from a c++ program? I just want to make sure armadillo has been compiled with 'atlas' or 'openblas' I found arma::arma_config cfg; but I have no idea what cfg contains. I've done some testing and found blas and atlas but openblas does not seem to be an option. Is there anywhere I can find a complete list of what cfg contains?
That is common misunderstanding. Armadillo uses the LAPACK/BLAS interface and you can switch the libraries out at will. edd#rob:/tmp$ g++ -o armadillo_example armadillo_example.cpp -larmadillo edd#rob:/tmp$ ./armadillo_example A*trans(B) = -0.3111 -0.3320 -0.8700 -0.8698 0.1312 -0.7760 -0.2394 -0.6150 -0.2320 -1.2993 -0.6748 -1.3584 -0.1677 -1.9175 0.6289 -0.5619 edd#rob:/tmp$ ldd armadillo_example linux-vdso.so.1 (0x00007fff92b5b000) libarmadillo.so.9 => /usr/lib/libarmadillo.so.9 (0x00007fe598ea5000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe598cc4000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe598b75000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe598b5a000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe598970000) libblas.so.3 => /usr/lib/x86_64-linux-gnu/libblas.so.3 (0x00007fe598910000) liblapack.so.3 => /usr/lib/x86_64-linux-gnu/liblapack.so.3 (0x00007fe598271000) libarpack.so.2 => /usr/lib/x86_64-linux-gnu/libarpack.so.2 (0x00007fe598229000) libsuperlu.so.5 => /usr/lib/x86_64-linux-gnu/libsuperlu.so.5 (0x00007fe5981b9000) /lib64/ld-linux-x86-64.so.2 (0x00007fe598ef1000) libopenblas.so.0 => /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (0x00007fe596025000) libgfortran.so.5 => /usr/lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007fe595d5d000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe595d39000) libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007fe595cef000) edd#rob:/tmp$ The armadillo shared library has similar links: edd#rob:/tmp$ ldd /usr/lib/libarmadillo.so.9 linux-vdso.so.1 (0x00007ffc98853000) libblas.so.3 => /usr/lib/x86_64-linux-gnu/libblas.so.3 (0x00007f6043563000) liblapack.so.3 => /usr/lib/x86_64-linux-gnu/liblapack.so.3 (0x00007f6042ec6000) libarpack.so.2 => /usr/lib/x86_64-linux-gnu/libarpack.so.2 (0x00007f6042e7e000) libsuperlu.so.5 => /usr/lib/x86_64-linux-gnu/libsuperlu.so.5 (0x00007f6042e0e000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6042c2d000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6042ade000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6042ac1000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f60428d7000) /lib64/ld-linux-x86-64.so.2 (0x00007f60435ff000) libopenblas.so.0 => /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (0x00007f6040743000) libgfortran.so.5 => /usr/lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007f604047b000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6040459000) libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f604040d000) edd#rob:/tmp$ On my Ubuntu system /usr/lib/x86_64-linux-gnu/libblas.so.3 is a softlink that gets updated when another BLAS/LAPACK package is installed allowing you to easil switch (which I use e.g. in this GitHub repo to show how to easily install MKL.
The structure of arma_config can be found in /usr/include/armadillo_bits/arma_config.hpp or wherever locate arma_config finds the file.
How to uninstall older versions of libcrypro library
I am trying to link the Unified Automation c++ OPCUA Stack to my project, but I am getting the warning : libcrypto.so.1.1, needed by libuastackd.so, may conflict with libcrypto.so.1.0.0 Followed by the error: :-1: error: libuapkicppd.a(uapkicertificate.cpp.o): undefined reference to symbol 'OPENSSL_sk_num##OPENSSL_1_1_0' From the command prompt, ldconfig on the shared libraries returns: craig#craig-B250-HD3P:~$ ldconfig -p | grep libssl libssl3.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libssl3.so libssl.so.1.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 libssl.so.1.0.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 libssl.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libssl.so craig#craig-B250-HD3P:~$ ldconfig -p | grep libcrypto libcrypto.so.1.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 libcrypto.so.1.0.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 libcrypto.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcrypto.so libcrypto++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcrypto++.so.6 craig#craig-B250-HD3P:~$ Can I safely delete libssl.so.1.0.0 (libc6,x86-64) and libcrypto.so.1.0.0?
Linker can't find mathgl library
I try to make mathgl work, but the linker can't find the library. I installed it through the user repository from arch linux. I just copied the example program: #include <mgl2/mgl.h> int main() { mglGraph gr; gr.FPlot("sin(pi*x)"); gr.WriteFrame("test.png"); } The official website states you need to link lmgl, but I get this error: $ g++ main.cpp -lmgl /usr/bin/ld: cannot find -lmgl collect2: error: ld returned 1 exit status I couldn't figure out where to start looking for the library. How can I see where it was installed? I was looking for libmgl with ldconfig -p getting these results: $ ldconfig -p | grep libmgl libmgl2.so.7.5.0 (libc6,x86-64) => /usr/lib/libmgl2.so.7.5.0 libmgl2.so (libc6,x86-64) => /usr/lib/libmgl2.so libmgl2-qt5.so.7.5.0 (libc6,x86-64) => /usr/lib/libmgl2-qt5.so.7.5.0 libmgl2-qt5.so (libc6,x86-64) => /usr/lib/libmgl2-qt5.so libmgl2-qt.so.7.5.0 (libc6,x86-64) => /usr/lib/libmgl2-qt.so.7.5.0 libmgl2-qt.so (libc6,x86-64) => /usr/lib/libmgl2-qt.so libmgl2-glut.so.7.5.0 (libc6,x86-64) => /usr/lib/libmgl2-glut.so.7.5.0 libmgl2-glut.so (libc6,x86-64) => /usr/lib/libmgl2-glut.so
As Amadeus indicated, using $ g++ main.cpp -lmgl2 should work.
ldd can't find library
I've already read this, this and this. I've installed OpenCV in a costum path /home/luca/ParallelOpenCV/install_icpc/lib, where there is libopencv_core.so: luca#jarvis:~$ ldd /home/luca/ParallelOpenCV/install_icpc/lib/libopencv_core.so linux-vdso.so.1 => (0x00007ffccb389000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f46af719000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f46af410000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f46af1f2000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f46aefea000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f46aedd0000) libimf.so => /opt/intel/compilers_and_libraries_2017.1.132/linux/compiler/lib/intel64/libimf.so (0x00007f46ae8e3000) libsvml.so => /opt/intel/compilers_and_libraries_2017.1.132/linux/compiler/lib/intel64/libsvml.so (0x00007f46ad9d8000) libirng.so => /opt/intel/compilers_and_libraries_2017.1.132/linux/compiler/lib/intel64/libirng.so (0x00007f46ad663000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f46ad2e0000) libiomp5.so => /opt/intel/compilers_and_libraries_2017.1.132/linux/compiler/lib/intel64/libiomp5.so (0x00007f46acf3d000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f46acd27000) libintlc.so.5 => /opt/intel/compilers_and_libraries_2017.1.132/linux/compiler/lib/intel64/libintlc.so.5 (0x00007f46acabc000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f46ac6f3000) /lib64/ld-linux-x86-64.so.2 (0x000055f67574e000) I added the path to LD_LIBRARY_PATH and I executed ldconfig, but: luca#jarvis:~$ ldd libopencv_core.so ldd: ./libopencv_core.so: No such file or directory What am I missing?
From man ldd:- NAME ldd - print shared object dependencies SYNOPSIS top ldd [option]... file... DESCRIPTION ldd prints the shared objects (shared libraries) required by each program or shared object specified on the command line. An example of its use and output is the following: $ ldd /bin/ls linux-vdso.so.1 (0x00007ffcc3563000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f87e5459000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f87e5254000) libc.so.6 => /lib64/libc.so.6 (0x00007f87e4e92000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f87e4c22000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f87e4a1e000) /lib64/ld-linux-x86-64.so.2 (0x00005574bf12e000) libattr.so.1 => /lib64/libattr.so.1 (0x00007f87e4817000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f87e45fa000) The output of your command: luca#jarvis:~$ ldd libopencv_core.so ldd: ./libopencv_core.so: No such file or directory says that the program or shared object supposedly specified on the commandline does not exist in the implied directory = ./ = /home/luca. We know it exists in /home/luca/ParallelOpenCV/install_icpc/lib. If you run ldd file, where file, after shell expansion, is the pathname of an existing file, then ldd will display the dynamic dependencies of that file, as discovered by the dynamic linker with its usual reliance upon the current ldconfig configuration and its usual regard to the operative LD_LIBRARY_PATH environment setting. It will not search your system for files that might be alternate candidates for a file that does not exist and display the dynamic dependencies of those candidates.
How to resolve warning /usr/bin/ld: warning: libtiff.so.4, needed by /home/user/libs/opencv/lib/libopencv_highgui.so, may conflict with libtiff.so.5?
Some C++ project use TIFF library and OpenCV library at the same time. The following warning is produced: /usr/bin/ld: warning: libtiff.so.4, needed by /home/user/libs/opencv/lib/libopencv_highgui.so, may conflict with libtiff.so.5, How can it be resolved? If it matters I'm using Ubuntu and Eclipse. /sbin/ldconfig -p > libs.txt show me libtiffxx.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libtiffxx.so.0 libtiffxx.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libtiffxx.so libtiff.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libtiff.so.4 libtiff.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libtiff.so libopencv_highgui.so.2.4 (libc6,x86-64) => /usr/local/lib/libopencv_highgui.so.2.4 libopencv_highgui.so.2.3 (libc6,x86-64) => /usr/lib/libopencv_highgui.so.2.3 libopencv_highgui.so (libc6,x86-64) => /usr/lib/libopencv_highgui.so But I don't know what it means, different versions of library?
I suggest you try the following: find a newer version of libopencv_highgui.so compiled with libtiff.so.5 recompile libopencv_highgui.so with libtiff.so.5 delete libtiff.so.4 and make a symlink to libtiff.so.5 if you get a linker error