**Error**: ```bash= ~/dev/torchcodec (main*) » python test/decoders/manual_smoke_test.py nicolashug@nicolashug-fedora-PF372ZT9 Traceback (most recent call last): File "/home/nicolashug/dev/torchcodec/test/decoders/manual_smoke_test.py", line 4, in <module> import torchcodec File "/home/nicolashug/dev/torchcodec/src/torchcodec/__init__.py", line 1, in <module> from . import decoders, samplers # noqa ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nicolashug/dev/torchcodec/src/torchcodec/samplers/__init__.py", line 5, in <module> from .video_clip_sampler import * # noqa ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nicolashug/dev/torchcodec/src/torchcodec/samplers/video_clip_sampler.py", line 12, in <module> from torchcodec.decoders._core import ( File "/home/nicolashug/dev/torchcodec/src/torchcodec/decoders/_core/__init__.py", line 5, in <module> from .video_decoder_ops import * # noqa ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nicolashug/dev/torchcodec/src/torchcodec/decoders/_core/video_decoder_ops.py", line 10, in <module> torch.ops.load_library(_get_extension_path("libtorchcodec")) File "/home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/torch/_ops.py", line 1278, in load_library ctypes.CDLL(path) File "/home/nicolashug/.miniconda3/envs/codec/lib/python3.11/ctypes/__init__.py", line 376, in __init__ self._handle = _dlopen(self._name, mode) ^^^^^^^^^^^^^^^^^^^^^^^^^ OSError: /home/nicolashug/.miniconda3/envs/codec/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.32' not found (required by /home/nicolashug/dev/torchcodec/src/torchcodec/libtorchcodec.so) ``` **Problem**: I compiled and linked torchcodec against `/usr/lib64/libstdc++.so.6` but at runtime the one that gets loaded is `/home/nicolashug/.miniconda3/envs/codec/bin/../lib/libstdc++.so.6`, and it's missing some version symbols. **IT IS NOT PYTHON'S FAULT IT IS OPENCV!!!!!!!!!!!!!** First: `torchcodec` WORKS: ``` ~/dev/torchcodec (main*) » LD_DEBUG=libs python -c "import torchcodec" 2>&1 | grep libstd 130 ↵ nicolashug@nicolashug-fedora-PF372ZT9 133672: find library=libstdc++.so.6 [0]; searching 133672: trying file=/home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/torch/lib/libstdc++.so.6 133672: trying file=/lib64/libstdc++.so.6 133672: calling init: /lib64/libstdc++.so.6 133672: calling fini: /lib64/libstdc++.so.6 [0] ``` There's no error here, I can import `torchcodec` without and error and ``/usr/lib64/libstdc++.so.6`` gets properly loaded. So it's not Python who is loading the wrong `/home/nicolashug/.miniconda3/envs/codec/bin/../lib/libstdc++.so.6` (well... we'll see). The loading of the wrong `/home/nicolashug/.miniconda3/envs/codec/bin/../lib/libstdc++.so.6` comes from opencv: ``` ~/dev/torchcodec (main*) » LD_DEBUG=libs python -c "import cv2" 2>&1 | grep libstd nicolashug@nicolashug-fedora-PF372ZT9 133766: find library=libstdc++.so.6 [0]; searching 133766: trying file=/home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/cv2/../opencv_python.libs/libstdc++.so.6 133766: trying file=/home/nicolashug/.miniconda3/envs/codec/bin/../lib/libstdc++.so.6 133766: calling init: /home/nicolashug/.miniconda3/envs/codec/bin/../lib/libstdc++.so.6 133766: calling fini: /home/nicolashug/.miniconda3/envs/codec/bin/../lib/libstdc++.so.6 [0] ``` And in fact, if I `import torchcodec` BEFORE `import cv2` in the smoke test, the smoke test runs fine!! ```diff= ~/dev/torchcodec (main*) » git diff -p | \cat nicolashug@nicolashug-fedora-PF372ZT9 diff --git a/test/decoders/manual_smoke_test.py b/test/decoders/manual_smoke_test.py index 07869c5..9690d99 100644 --- a/test/decoders/manual_smoke_test.py +++ b/test/decoders/manual_smoke_test.py @@ -1,7 +1,7 @@ import os -import cv2 import torchcodec +import cv2 decoder = torchcodec.decoders._core.create_from_file( os.path.dirname(__file__) + "/resources/nasa_13013.mp4" ``` ``` ~/dev/torchcodec (main*) » python test/decoders/manual_smoke_test.py && echo $? 130 ↵ nicolashug@nicolashug-fedora-PF372ZT9 0 ``` **So why is opencv loading the conda libstd?** This is still somewhat of a mystery to me but running ```bash= LD_DEBUG=all python -c "import cv2" > all 2>&1 ``` we see ``` 944879: file=libstdc++.so.6 [0]; needed by /home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/cv2/cv2.abi3.so [0] 944879: find library=libstdc++.so.6 [0]; searching 944879: search path=/home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/cv2/../opencv_python.libs (RPATH from file /home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/cv2/cv2.abi3.so) 944879: trying file=/home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/cv2/../opencv_python.libs/libstdc++.so.6 944879: search path=/home/nicolashug/.miniconda3/envs/codec/bin/../lib (RPATH from file python) 944879: trying file=/home/nicolashug/.miniconda3/envs/codec/bin/../lib/libstdc++.so.6 ``` in particular `(RPATH from file python)` is the part that is weird and I cannot explain it. I don't understand why Python's `rpath` is used in the search path here. Note that when doing just `import torchcodec`, python's rpath isn't used in the search path is ``` file=libstdc++.so.6 [0]; needed by /home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/torch/lib/libtorch_python.so [0] find library=libstdc++.so.6 [0]; searching search path=/home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/torch/lib (RUNPATH from file /home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/torch/lib/libtorch_global_deps.so) trying file=/home/nicolashug/.miniconda3/envs/codec/lib/python3.11/site-packages/torch/lib/libstdc++.so.6 search cache=/etc/ld.so.cache trying file=/lib64/libstdc++.so.6 ``` despite the fact that python's rpath *is indeed* used to load other SOs previously during execution, e.g. this one is loaded way before `libstd`: ``` file=libdl.so.2 [0]; needed by python [0] find library=libdl.so.2 [0]; searching search path=/home/nicolashug/.miniconda3/envs/codec/bin/../lib (RPATH from file python) trying file=/home/nicolashug/.miniconda3/envs/codec/bin/../lib/libdl.so.2 search cache=/etc/ld.so.cache trying file=/lib64/libdl.so.2 ```