Я понял это (после небольшого количества экспериментов и удачи).
Вся проблема пахла проблемой с ld
и процессом связывания библиотеки C libssl, необходимой для git использовать S SH соединения.
Pop! _OS известна тем, что в нее включено много "необходимых для разработки" вещей, поэтому я был уверен, что у меня все это есть (у меня).
Как я это исправил?
Я посмотрел на каталог /etc/ld.so.conf.d/
. Там есть несколько файлов ".conf". x86_64-linux-gnu.conf
указал на /usr/lib/x86_64-linux-gnu
, поэтому я пошел туда, чтобы посмотреть, какие библиотеки соответствуют libssh*
.
Я нашел это:
$ ls -ls /usr/lib/x86_64-linux-gnu/libssh*
312 -rw-r--r-- 1 root root 316732 Sep 5 2019 libssh2.a
0 lrwxrwxrwx 1 root root 16 Sep 5 2019 libssh2.so -> libssh2.so.1.0.1
0 lrwxrwxrwx 1 root root 16 Sep 5 2019 libssh2.so.1 -> libssh2.so.1.0.1
184 -rw-r--r-- 1 root root 186856 Sep 5 2019 libssh2.so.1.0.1
1040 -rw-r--r-- 1 root root 1061468 Dec 10 16:24 libssh.a
0 lrwxrwxrwx 1 root root 22 Dec 10 16:24 libssh-gcrypt.so.4 -> libssh-gcrypt.so.4.8.1
552 -rw-r--r-- 1 root root 564760 Dec 10 16:24 libssh-gcrypt.so.4.8.1
0 lrwxrwxrwx 1 root root 11 Dec 10 16:24 libssh.so -> libssh.so.4
0 lrwxrwxrwx 1 root root 15 Dec 10 16:24 libssh.so.4 -> libssh.so.4.8.1
552 -rw-r--r-- 1 root root 564856 Dec 10 16:24 libssh.so.4.8.1
При сравнении этого вывода с недавно установленной виртуальной машиной, которая не демонстрирует эту проблему, я заметил, что все файлы libssh2*
В ВМ не существовало.
Поскольку все ошибки компоновщика есть в gcry (что, я думаю, означает cryPT
), я решил попробовать удалить две версии и оставить только ту, которая работает:
$ sudo apt remove libssh2-1-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libhttp-parser-dev libmbedtls-dev
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
libgit2-dev libssh2-1-dev
0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded.
After this operation, 3,700 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 412520 files and directories currently installed.)
Removing libgit2-dev:amd64 (0.27.7+dfsg.1-0.2build1) ...
Removing libssh2-1-dev:amd64 (1.8.0-2.1build1) ...
Processing triggers for man-db (2.8.7-3) ...
После этого я получил ожидаемый результат:
$ cargo run
warning: unused variable: `repo`
--> src/main.rs:6:9
|
6 | let repo = match Repository::open("fakerepo") {
| ^^^^ help: consider prefixing with an underscore: `_repo`
|
= note: `#[warn(unused_variables)]` on by default
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/xxx`
Hello, world!
thread 'main' panicked at 'Failed to init failed to resolve path 'fakerepo': No such file or directory; class=Os (2); code=NotFound (-3)', src/main.rs:8:19
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
Если я инициализирую репо git и запускаю его снова, ошибки, как и ожидалось, не возникает:
$ mkdir fakerepo; cd fakerepo ; git init ; cd ..
Initialized empty Git repository in /home/martin/dev/rust/xxx/fakerepo/.git/
$ cargo run
warning: unused variable: `repo`
--> src/main.rs:6:9
|
6 | let repo = match Repository::open("fakerepo") {
| ^^^^ help: consider prefixing with an underscore: `_repo`
|
= note: `#[warn(unused_variables)]` on by default
Finished dev [unoptimized + debuginfo] target(s) in 0.03s
Running `target/debug/xxx`
Hello, world!
Кажется, проблема в том, что библиотека. Я исследую далее, чтобы узнать, откуда он (кто его установил) и, что более важно, как сделать это без проблем (должен быть способ сообщить всему процессу сборки, какую библиотеку выбрать), но это другая проблема на другой день.
Что я сделал, чтобы выяснить это?
Трюк с виртуальной машиной был чем-то, что я делал раньше, чтобы решить другие проблемы. Linux очень легко / быстро установить на виртуальные машины, а Gnome Boxes уже установлен и настроен на моем Pop! _OS, поэтому мне потребовалась 1 минута, чтобы запустить его и иметь перед собой только что установленную ОС (хорошо, это было не бесплатно sh, мне нужно было загрузить как 150 обновлений в ВМ):)
В любом случае, у меня была установлена Peppermint OS ; супер легкий дистрибутив на основе Ubuntu, который не так уж много мешает, так что он идеально подходит для моих нужд. Все, что мне нужно было сделать на ОС Peppermint, чтобы начать, это:
После этого я смог запустить тот же самый проект hello world , Когда я понял, что это работает на этой виртуальной машине, я сделал это снова на только что установленной виртуальной машине Pop! _OS 19.10. И снова это сработало. (это меня удивило, так как я неправильно обвинял "Pop_OS").
Тот факт, что это работало на обеих виртуальных машинах с небольшим вкладом от меня, побудил меня продолжать пытаться на моей основной машине; Я рад, что сделал.