новичок в ржавчине, я пытаюсь создать фиктивный обратный прокси-сервер с tokio и axum, вы можете найти его здесь. Собирая все вместе, я натыкаюсь на эту ошибку:
error: linking with `cc` failed: exit status: 1
|
...
= note: /usr/bin/ld: /home/fpezzati/workspace/keymaster/target/debug/deps/libreqwest-ca3141de8b4ae515.rlib(reqwest-ca3141de8b4ae515.reqwest.5838258711064664-cgu.12.rcgu.o): in function `openssl::ssl::SslStream<S>::ssl_read_uninit':
/home/fpezzati/.cargo/registry/src/index.crates.io-6f17d22bba15001f/openssl-0.10.64/src/ssl/mod.rs:3786: undefined reference to `SSL_read_ex'
...
/usr/bin/ld: /home/fpezzati/workspace/keymaster/target/debug/deps/libopenssl_sys-661b9af21fb0f20e.rlib(openssl_sys-661b9af21fb0f20e.openssl_sys.47e9ab06f8f5ff97-cgu.0.rcgu.o): in function `openssl_sys::openssl::ssl::SSL_CTX_set_max_proto_version':
/home/fpezzati/.cargo/registry/src/index.crates.io-6f17d22bba15001f/openssl-sys-0.9.102/src/./ssl.rs:468: undefined reference to `SSL_CTX_ctrl'
collect2: error: ld returned 1 exit status
= note: some `extern` functions couldn't be found; some native libraries may need to be installed or have their path specified
= note: use the `-l` flag to specify native libraries to link
= note: use the `cargo:rustc-link-lib` directive to specify the native libraries to link with Cargo (see https://doc.rust-lang.org/cargo/reference/build-scripts.html#cargorustc-link-libkindname)
warning: `keymaster` (bin "keymaster") generated 6 warnings
error: could not compile `keymaster` (bin "keymaster") due to 1 previous error; 6 warnings emitted
Похоже, что-то не так с моим ящиком openssl
и reqwest
(они оба появляются в выходных данных), но я не понимаю, что именно, и не могу найти решение этой проблемы. Я пытаюсь собрать это, используя ржавчину 1.76, openssl 3.0.2 в дистрибутиве Mint. Я также пытался создать то же самое на последнем образе докера Rust, но обнаружил другие проблемы (отсутствует cmake). Я также буду признателен за любые подсказки о том, как бороться/отлаживать подобные ошибки, я новичок в ржавчине и системном программировании в целом. Спасибо.
ОБНОВЛЯТЬ Я добавил минимальный (насколько это возможно) пример, чтобы воспроизвести ошибку:
use axum::{
http::StatusCode, response::IntoResponse, routing::get, Json, Router
};
use serde::{Deserialize, Serialize};
use tokio::net::TcpListener;
use jwt_simple::prelude::RS384KeyPair;
use jwt_simple::prelude::Duration;
use jwt_simple::algorithms::RSAKeyPairLike;
use jwt_simple::claims::Claims;
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(helloproxy));
let listener = TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
async fn helloproxy() -> impl IntoResponse {
let client = reqwest::Client::new();
match client.get("https://www.rust-lang.org").send().await {
Ok(resp) => {
let status = resp.status();
let pkey = RS384KeyPair::from_pem("/tmp/valid.private.key").unwrap();
let unsigned_claims = Claims::create(Duration::from_hours(2));
let signed_claims = pkey.sign(unsigned_claims).unwrap();
(status, Json(String::from("{ msg: 'hello' }")))
},
Err(e) => {
(StatusCode::INTERNAL_SERVER_ERROR, Json(String::from("{ msg: 'hello' }")))
}
}
}
с этими зависимостями:
[dependencies]
axum = "0.7.5"
jwt-simple = "0.12.9"
reqwest = "0.12.5"
serde = "1.0.204"
tokio = { version = "1.38.1", features = [ "full" ] }
Я заметил, что проблема возникла после использования jwt-simple
, возможно, это поможет. Пожалуйста, дайте мне знать, если информации недостаточно, я новичок в ржавчине и системном программировании в целом.
Пожалуйста, укажите Минимально воспроизводимый пример в вопросе, а не в виде ссылки.
Я решил свою проблему, заменив зависимость jwt-simple
следующим образом:
jwt-simple = { version = "0.12.9", default-features=false, features = [ "pure-rust" ] }
в моем Cargo.toml
. Поскольку я новичок в системном программировании, ошибка связывания была дымом для моих глаз. Как только я создал минимальный воспроизводимый пример, я понял, что jwt-simple
является причиной проблемы. Внимательное чтение страницы его ящика дало мне решение:
В качестве временного решения проблем переносимости одной из зависимостей (скучный ящик) эту библиотеку можно скомпилировать для использования только реализаций Rust.
Для этого импортируйте ящик с параметрами default-features=false, Features=["pure-rust"] в конфигурации вашего Cargo.
Пожалуйста, отредактируйте заголовок вашего вопроса, чтобы он был описательным, недвусмысленным и конкретным в отношении того, что вы спрашиваете. Дополнительные рекомендации см. в разделе Как написать хороший заголовок?.