在
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
然后再在
export PATH=$PATH:$HOME/.cargo/bin
再执行
no_core 的时候,经常出现 libc 多了一个版本导致无法正常编译的情况,删除 commit 版本旧的那个即可
/etc/profile 里添加了 #guideexport RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
然后再在
.bashrc .zshrc 里添加(如果自动无效的话)export PATH=$PATH:$HOME/.cargo/bin
再执行
curl https://sh.rustup.rs -sSf | sh
即可获得现烤 Rust toolchain 一份 🍰no_core 的时候,经常出现 libc 多了一个版本导致无法正常编译的情况,删除 commit 版本旧的那个即可
// main.rs
#![feature(lang_items)]
#![feature(no_core)]
#![feature(libc)]
#![no_core]
extern crate libc;
extern crate core;
use libc::printf;
use core::panic::PanicInfo;
#[no_mangle]
pub unsafe extern "C" fn _main(argc: i32, argv: *const *const u8) -> i32 {
printf("Hello, world!\n\00".as_ptr() as *const i8);
return 0;
}
#[lang = "eh_personality"]
#[no_mangle]
pub extern "C" fn eh_personality() {}
#[panic_handler]
#[no_mangle]
pub extern "C" fn panic_handler(p: &PanicInfo) -> ! {
loop {} // never return
}
// main.c
int _main(int _, char **__);
int main(int argc, char **argv) { return _main(argc, argv); }
# Makefile
RUSTC := rustc # rust compiler
RUSTDOC := rustdoc # rust doc generator
# compiler flags
RUSTCFLAGS := -O --color auto
RUSTDOCFLAGS := -v
# default target
RUSTTARGET := x86_64-unknown-linux-gnu
RUSTCFLAGS := $(RUSTCFLAGS) --target $(RUSTTARGET)
ifeq ($(DEBUG), 1) # use debug info
RUSTCFLAGS := $(RUSTCFLAGS) -g -v
endif
snappy: main.c libsnappy.a
$(CC) $(CFLAGS) $? -o $@
libsnappy.a: main.rs
$(RUSTC) $(RUSTCFLAGS) $? --crate-type staticlib --crate-name snappy
最后目标文件大小 8.7K,我赢了,duangsuse 想(
duangsuse::Echo
// main.rs #![feature(lang_items)] #![feature(no_core)] #![feature(libc)] #![no_core] extern crate libc; extern crate core; use libc::printf; use core::panic::PanicInfo; #[no_mangle] pub unsafe extern "C" fn _main(argc: i32, argv: *const *const u8) ->…
因为今天实在是太晚了... 暂时决定功能如此(因为 snappy 自己目前居然没有一个前端可用):
将 每个 file 压缩为 file.snappy,- 被当作 stdin
将 file 解压缩,默认标准输出
snappy [files]将 每个 file 压缩为 file.snappy,- 被当作 stdin
unsnappy [file] [output]将 file 解压缩,默认标准输出
#learn 学会了什么? 👾
0. 知道自己对
1. 写了第一行这么长又简单易懂的 GNU Makefile...
2. 机制地利用 C 给不使用 std 的 Rust 函数导出弄了个
3. 复习了 Rust,会在不使用外部 crate 和 cargo 和 IDE 的情况下工作
4. 留下了明天不睡到中午就不能平复的倦意...(悲)
0. 知道自己对
f*() 系列文件操作函数、mmap() 和 Rust FFI 还不熟(准确的说对 Rust 整个都不熟,更别提 #![no_std] 了) 1. 写了第一行这么长又简单易懂的 GNU Makefile...
2. 机制地利用 C 给不使用 std 的 Rust 函数导出弄了个
_start 不至于每天 segfault3. 复习了 Rust,会在不使用外部 crate 和 cargo 和 IDE 的情况下工作
4. 留下了明天不睡到中午就不能平复的倦意...(悲)
duangsuse::Echo
(写不下去了(毕竟熬夜太久伤身体啊
突然想到某些 JVM、Ruby 程序员可能会说 "300 多行都写了 3 个小时,真慢啊"
... 拿
还好现在是写 C 版本的 Rust,生命周期什么的考虑得少一些,不然思路绝对要迫真崩坏,惹不起啊
算法要设计半天实现起来也得画啥生命周期图分析...
Crystal 虽然比 Ruby 底层但还是有个 Slice 啊,还是有标准的 OO 类型系统啊,这个 Rust 如果不熟想的话真是要死人啊,不信你们写啊...
写了三个小时真是感觉无法形容 😶...
... 拿
#![no_std] 的 Rust 写这玩意可不止比你们那全自动高端大气上档次 GC 折腾,比完全拿 C 写还折腾...还好现在是写 C 版本的 Rust,生命周期什么的考虑得少一些,不然思路绝对要迫真崩坏,惹不起啊
算法要设计半天实现起来也得画啥生命周期图分析...
Crystal 虽然比 Ruby 底层但还是有个 Slice 啊,还是有标准的 OO 类型系统啊,这个 Rust 如果不熟想的话真是要死人啊,不信你们写啊...
写了三个小时真是感觉无法形容 😶...
duangsuse::Echo
#recommended #kotlin #dev out 等关键字:可以说是写得很好的文档了,易懂 https://www.kotlincn.net/docs/reference/keyword-reference.html