Невозможно связать git2-rs из-за множества неопределенных ссылок на символы gcry- * - PullRequest
1 голос
/ 10 марта 2020

Среда

  • Linux (Pop! _OS, если это имеет значение, а значит, это почти Ubuntu).
 $ cargo --version
cargo 1.41.0 (626f0f40e 2019-12-03)

 $ rustc --version
rustc 1.41.0 (5e1a79984 2020-01-27)

Что я сделал

$ cargo new xxx
     Created binary (application) `xxx` package

Я отредактировал Cargo.toml, чтобы он выглядел так:

[package]
  name = "xxx"
  version = "0.1.0"
  authors = ["Martin Marconcini <xxx@xxx.com>"]
  edition = "2018"

 [dependencies]
 git2 = "0.12.0"

И main.rs:

use git2::Repository;

fn main() {
    println!("Hello, world!");

    let repo = match Repository::open("fake/path") {
        Ok(repo) => repo,
        Err(e) => panic!("Failed to init {}", e),
    };
}

Выпуск

Я знаю fake/path не будет работать, но я ожидаю, что программа будет собираться, связываться и pani c при запуске. Вместо этого, когда я пробегаю машину go, вот что я получаю:

 $ cargo run
    Updating crates.io index
   Compiling libc v0.2.67
   Compiling pkg-config v0.3.17
   Compiling autocfg v1.0.0
   Compiling smallvec v1.2.0
   Compiling matches v0.1.8
   Compiling bitflags v1.2.1
   Compiling log v0.4.8
   Compiling cfg-if v0.1.10
   Compiling percent-encoding v2.1.0
   Compiling openssl-probe v0.1.2
   Compiling unicode-bidi v0.3.4
   Compiling unicode-normalization v0.1.12
   Compiling jobserver v0.1.21
   Compiling idna v0.2.0
   Compiling cc v1.0.50
   Compiling url v2.1.1
   Compiling libz-sys v1.0.25
   Compiling openssl-sys v0.9.54
   Compiling libssh2-sys v0.2.16
   Compiling libgit2-sys v0.11.0+0.99.0
   Compiling git2 v0.12.0
   Compiling xxx v0.1.0 (/home/martin/dev/rust/xxx)
warning: unused variable: `repo`
 --> src/main.rs:6:9
  |
6 |     let repo = match Repository::open("/fake/path") {
  |         ^^^^ help: consider prefixing with an underscore: `_repo`
  |
  = note: `#[warn(unused_variables)]` on by default

error: linking with `cc` failed: exit code: 1
  |
  = note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.1g3apxivazecmby1.rcgu.o" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.1ktaa7mhzl12qb8s.rcgu.o" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.1of15nz9rghhwcp.rcgu.o" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.1pzhxyvu6x3rpyd4.rcgu.o" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.1xjrgwir8ul0gxyn.rcgu.o" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.236nnnkop2p1q7o.rcgu.o" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.346upd227a1u5o1x.rcgu.o" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.4vpli3o8gp9bo7bb.rcgu.o" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.fjvxd6ccfznqzmo.rcgu.o" "-o" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620" "/home/martin/dev/rust/xxx/target/debug/deps/xxx-fe6ac189d82a9620.2bpv5j881nolkdhg.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-nodefaultlibs" "-L" "/home/martin/dev/rust/xxx/target/debug/deps" "-L" "/home/martin/dev/rust/xxx/target/debug/build/libgit2-sys-9a380c1f1af1ff52/out/build" "-L" "/usr/lib/x86_64-linux-gnu" "-L" "/home/martin/dev/rust/xxx/target/debug/build/libssh2-sys-76c9f6db4b487643/out/build" "-L" "/usr/lib/x86_64-linux-gnu" "-L" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/home/martin/dev/rust/xxx/target/debug/deps/libgit2-e4070b896a12b23e.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libopenssl_probe-02ad0051245c142f.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/liburl-752d8a16592303c8.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libpercent_encoding-3f375297ed36a953.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libidna-a849b89d54cc2589.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libunicode_normalization-81788f9135a21d94.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libsmallvec-e36b82e338fe18d3.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libunicode_bidi-901a064d2af6777d.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libmatches-ccee7833d11c4363.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/liblog-aba47d2dbe489265.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libcfg_if-fd0f59c38961bb3a.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/liblibgit2_sys-b077f325e2a7224c.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libopenssl_sys-b21cd1cefc781387.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/liblibz_sys-c72b1cae7b178c73.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/liblibc-a68ece9bb60c0ea2.rlib" "/home/martin/dev/rust/xxx/target/debug/deps/libbitflags-468acf5fe2f3e68a.rlib" "-Wl,--start-group" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-9d59e25e2eb2384d.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-4affccee0db9d60e.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-cd6b495608e342d1.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-347d88a586b28b4c.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace-46f3dc0b263b900a.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace_sys-6789aa6fbcfdf14c.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-9f9436f1ab051941.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-ad8ec269e6d86d01.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-3699f95d33475c27.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-fe798441633702e1.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-979288990efe6065.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-2181f1e1dd7399d7.rlib" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-b8952fd765001238.rlib" "-Wl,--end-group" "/home/martin/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-e99fedbd2b621435.rlib" "-Wl,-Bdynamic" "-lz" "-lssl" "-lcrypto" "-lz" "-lutil" "-ldl" "-lutil" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-lutil"
  = note: /usr/bin/ld: /home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib(libgcrypt.o): in function `_libssh2_rsa_new':
          (.text+0x48): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: (.text+0x77): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: /home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib(libgcrypt.o): in function `_libssh2_rsa_sha1_verify':
          (.text+0xcb): undefined reference to `gcry_md_hash_buffer'
          /usr/bin/ld: (.text+0xe8): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: (.text+0x103): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: (.text+0x118): undefined reference to `gcry_pk_verify'
          /usr/bin/ld: (.text+0x123): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: (.text+0x12d): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: (.text+0x166): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: /home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib(libgcrypt.o): in function `_libssh2_dsa_new':
          (.text+0x1cc): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: (.text+0x203): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: /home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib(libgcrypt.o): in function `_libssh2_rsa_sha1_sign':
          (.text+0x73f): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: (.text+0x757): undefined reference to `gcry_pk_sign'
          /usr/bin/ld: (.text+0x763): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: (.text+0x77d): undefined reference to `gcry_sexp_find_token'
          /usr/bin/ld: (.text+0x79d): undefined reference to `gcry_sexp_nth_data'
          /usr/bin/ld: /home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib(libgcrypt.o): in function `_libssh2_dsa_sha1_sign':
          (.text+0x87c): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: (.text+0x896): undefined reference to `gcry_pk_sign'
          /usr/bin/ld: (.text+0x8a2): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: (.text+0x8d0): undefined reference to `gcry_sexp_find_token'
          /usr/bin/ld: (.text+0x8f3): undefined reference to `gcry_sexp_nth_data'
          /usr/bin/ld: (.text+0x937): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: (.text+0x946): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: (.text+0x985): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: (.text+0x998): undefined reference to `gcry_sexp_find_token'
          /usr/bin/ld: (.text+0x9b2): undefined reference to `gcry_sexp_nth_data'
          /usr/bin/ld: /home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib(libgcrypt.o): in function `_libssh2_dsa_sha1_verify':
          (.text+0xa62): undefined reference to `gcry_md_hash_buffer'
          /usr/bin/ld: (.text+0xa84): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: (.text+0xab2): undefined reference to `gcry_sexp_build'
          /usr/bin/ld: (.text+0xac9): undefined reference to `gcry_pk_verify'
          /usr/bin/ld: (.text+0xad4): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: (.text+0xade): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: (.text+0xb16): undefined reference to `gcry_sexp_release'
          /usr/bin/ld: /home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib(libgcrypt.o): in function `_libssh2_cipher_init':
          (.text+0xb5a): undefined reference to `gcry_cipher_get_algo_keylen'
          /usr/bin/ld: (.text+0xb6c): undefined reference to `gcry_cipher_open'
          /usr/bin/ld: (.text+0xb7f): undefined reference to `gcry_cipher_setkey'
          /usr/bin/ld: (.text+0xba4): undefined reference to `gcry_cipher_get_algo_blklen'
          /usr/bin/ld: (.text+0xbb8): undefined reference to `gcry_cipher_setiv'
          /usr/bin/ld: (.text+0xbc5): undefined reference to `gcry_cipher_close'
          /usr/bin/ld: (.text+0xbd1): undefined reference to `gcry_cipher_setctr'
          /usr/bin/ld: /home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib(libgcrypt.o): in function `_libssh2_cipher_crypt':
          (.text+0xc02): undefined reference to `gcry_cipher_encrypt'
          /usr/bin/ld: (.text+0xc11): undefined reference to `gcry_cipher_decrypt'
          /usr/bin/ld: /home/martin/dev/rust/xxx/target/debug/deps/liblibssh2_sys-187467b0efb35c13.rlib(global.o): in function `libssh2_init':
          (.text+0x38): undefined reference to `gcry_control'
          collect2: error: ld returned 1 exit status
  • Я искал ответы в Интернете, но, похоже, большинство результатов git2-rs этого не делают даже говорить об этом, что, возможно, означает, что я пропускаю -dev зависимость или что-то в этом роде.

  • Я видел это и это , но в обоих случаях нет настройки или какого-либо автомобиля go .toml, чтобы посмотреть на ,

  • Я видел официальный репозиторий GitHub для git2-rs и скомпилировал его с cargo build, и это сработало.

  • Запустили эти две команды:

    $ pkg-config --libs openssl
    -lssl -lcrypto
    

    и

    $ pkg-config --cflags openssl
    

    ^ Эта команда не выдает результатов, которые, я считаю, ожидаются.

    building git2-rs

Где мне искать дальше? Я предполагаю, что мне не хватает библиотеки или что у меня не та версия.

1 Ответ

1 голос
/ 11 марта 2020

Я понял это (после небольшого количества экспериментов и удачи).

Вся проблема пахла проблемой с 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").

Тот факт, что это работало на обеих виртуальных машинах с небольшим вкладом от меня, побудил меня продолжать пытаться на моей основной машине; Я рад, что сделал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...