'Programming/rust'에 해당되는 글 13건

  1. 2023.05.26 rust mut 외 몇가지 컴파일 에러들
  2. 2023.05.25 rust mut
  3. 2023.05.25 rust visibility and privacy
  4. 2023.05.25 rust 소유권
  5. 2023.05.20 rust was
  6. 2023.05.11 c에서 rust 호출하기
  7. 2023.05.11 rust 실행파일
  8. 2023.05.11 rust if문
  9. 2023.05.10 rust rustup doc
  10. 2023.05.09 rust cargo new를 통한 프로젝트 생성
Programming/rust2023. 5. 26. 23:31

use std::io; 없이 사용시

error[E0433]: failed to resolve: use of undeclared crate or module `io`
 --> main.rs:8:5
  |
8 |     io::stdin()
  |     ^^
  |     |
  |     use of undeclared crate or module `io`
  |     help: a builtin type with a similar name exists: `i8`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0433`.




변수 사용 없음 (경고)

warning: unused `Result` that must be used
  --> main.rs:10:5
   |
10 | /     io::stdin()
11 | |         .read_line(&mut guess);
   | |______________________________^
   |
   = note: this `Result` may be an `Err` variant, which should be handled
   = note: `#[warn(unused_must_use)]` on by default

warning: 1 warning emitted




read_line mut 없이

error[E0308]: mismatched types
  --> main.rs:11:20
   |
11 |         .read_line(&guess);
   |          --------- ^^^^^^ types differ in mutability
   |          |
   |          arguments to this method are incorrect
   |
   = note: expected mutable reference `&mut String`
                      found reference `&String`
note: method defined here
  --> /rustc/84c898d65adf2f39a5a98507f1fe0ce10a2b8dbc\library\std\src\io\stdio.rs:383:12

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.





///
let guess = String::new();
    io::stdin().read_line(&mut guess);
///

error[E0596]: cannot borrow `guess` as mutable, as it is not declared as mutable
  --> main.rs:11:20
   |
11 |         .read_line(&mut guess);
   |                    ^^^^^^^^^^ cannot borrow as mutable
   |
help: consider changing this to be mutable
   |
8  |     let mut guess = String::new();
   |         +++

error: aborting due to previous error

For more information about this error, try `rustc --explain E0596`.







//
let guess = String::new();
    io::stdin().read_line(&guess);
//

error[E0308]: mismatched types
 --> main.rs:9:27
  |
9 |     io::stdin().read_line(&guess);
  |                 --------- ^^^^^^ types differ in mutability
  |                 |
  |                 arguments to this method are incorrect
  |
  = note: expected mutable reference `&mut String`
                     found reference `&String`
note: method defined here
 --> /rustc/84c898d65adf2f39a5a98507f1fe0ce10a2b8dbc\library\std\src\io\stdio.rs:383:12

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.










'Programming > rust' 카테고리의 다른 글

rust mut  (0) 2023.05.25
rust visibility and privacy  (0) 2023.05.25
rust 소유권  (0) 2023.05.25
rust was  (0) 2023.05.20
c에서 rust 호출하기  (0) 2023.05.11
Posted by 구차니
Programming/rust2023. 5. 25. 19:53

변수에 값을 넣으면 c 처럼 값이 변경되지 않아

let을 이용 재귀적으로 다시 할당을 하거나 mut 키워드로 변경이 가능한 변수로 지정해야 한다.

fn main() {
    let x = 5;
    println!("The value of x is: {x}");
    x = 6;
    println!("The value of x is: {x}");
}

$ cargo run
   Compiling variables v0.1.0 (file:///projects/variables)
error[E0384]: cannot assign twice to immutable variable `x`
 --> src/main.rs:4:5
  |
2 |     let x = 5;
  |         -
  |         |
  |         first assignment to `x`
  |         help: consider making this binding mutable: `mut x`
3 |     println!("The value of x is: {x}");
4 |     x = 6;
  |     ^^^^^ cannot assign twice to immutable variable

For more information about this error, try `rustc --explain E0384`.
error: could not compile `variables` due to previous error

 

좀 더 아래 shadowing 에 있는 예제인데

let x = 5;

let x = x + 1; 을 이용해서 자기 자신에게 새로운 값을 소유하게 하는 것은 인정 되는 듯

fn main() {
    let x = 5;

    let x = x + 1;

    {
        let x = x * 2;
        println!("The value of x in the inner scope is: {x}");
    }

    println!("The value of x is: {x}");
}

 

아무튼 언어 설계상 정석은 mut 키워드를 쓰는 것으로 보인다.

fn main() {
    let mut x = 5;
    println!("The value of x is: {x}");
    x = 6;
    println!("The value of x is: {x}");
}

 

[링크 : https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html]

'Programming > rust' 카테고리의 다른 글

rust mut 외 몇가지 컴파일 에러들  (0) 2023.05.26
rust visibility and privacy  (0) 2023.05.25
rust 소유권  (0) 2023.05.25
rust was  (0) 2023.05.20
c에서 rust 호출하기  (0) 2023.05.11
Posted by 구차니
Programming/rust2023. 5. 25. 19:40

pub 이라는 키워드가 존재해서

Syntax
Visibility :
      pub
   | pub ( crate )
   | pub ( self )
   | pub ( super )
   | pub ( in SimplePath )

 

기본은 private 이고 public으로 할 녀석들만 pub로 해주면 된다.

그런데 rust는 객체지향 언어는 아니라니까 class가 존재하지 않는데

c언어 처럼 static 키워드로 내/외부용으로 구분하는 수준이 되려나?

구조체에서 개별 항목에 대해서 pub이 적용되는지 조금 더 찾아봐야 할 것 같다.

// Declare a private struct
struct Foo;

// Declare a public struct with a private field
pub struct Bar {
    field: i32,
}

// Declare a public enum with two public variants
pub enum State {
    PubliclyAccessibleState,
    PubliclyAccessibleState2,
}

[링크 : https://doc.rust-lang.org/reference/visibility-and-privacy.html]

'Programming > rust' 카테고리의 다른 글

rust mut 외 몇가지 컴파일 에러들  (0) 2023.05.26
rust mut  (0) 2023.05.25
rust 소유권  (0) 2023.05.25
rust was  (0) 2023.05.20
c에서 rust 호출하기  (0) 2023.05.11
Posted by 구차니
Programming/rust2023. 5. 25. 12:46

rust에 추가된 개념으로 변수의 소유권 이라는 것이 있다.

좀 더 봐야 하지만, stack에 저장되는 경우에는 적용이 되지 않고 heap에 저장되는 변수들에 대해서 적용 될 것으로 예상된다.

변수 타입중 primitive와는 연관이 없을 것 같긴하다.

[링크 : https://doc.rust-lang.org/book/ch03-02-data-types.html]

 

소유자는 하나이다. 이게 포인트

Ownership Rules
First, let’s take a look at the ownership rules. Keep these rules in mind as we work through the examples that illustrate them:

Each value in Rust has an owner.
There can only be one owner at a time.
When the owner goes out of scope, the value will be dropped.

 

primitive 타입이라 그런건지 아니면 heap이 아닌 stack에 생성되는 변수이기 때문인진 좀 더 봐야 하지만

x = 5; y = x;의 경우에는 5의 소유권이 x에 있지만 y = x를 통해 x가 지닌 5의 소유권이 y에게로 가는 것으로 보이진 않는다.

Variables and Data Interacting with Move
Multiple variables can interact with the same data in different ways in Rust. Let’s look at an example using an integer in Listing 4-2.

    let x = 5;
    let y = x;
Listing 4-2: Assigning the integer value of variable x to y

We can probably guess what this is doing: “bind the value 5 to x; then make a copy of the value in x and bind it to y.” We now have two variables, x and y, and both equal 5. This is indeed what is happening, because integers are simple values with a known, fixed size, and these two 5 values are pushed onto the stack.

Now let’s look at the String version:

    let s1 = String::from("hello");
    let s2 = s1;
This looks very similar, so we might assume that the way it works would be the same: that is, the second line would make a copy of the value in s1 and bind it to s2. But this isn’t quite what happens.

 

간단(?)하게 생각하면 중괄호 끝날때가 scope의 끝이고

(사용자에게 보이진 않지만) 그때 마다 drop 함수가 호출되고 메모리 관리가 수행되는 것으로 생각된다.

그리고 이 때 소유권에 따라 사용되지 않는 변수는 사라지게 된다.

There is a natural point at which we can return the memory our String needs to the allocator: when s goes out of scope. When a variable goes out of scope, Rust calls a special function for us. This function is called drop, and it’s where the author of String can put the code to return the memory. Rust calls drop automatically at the closing curly bracket.

Note: In C++, this pattern of deallocating resources at the end of an item’s lifetime is sometimes called Resource Acquisition Is Initialization (RAII). The drop function in Rust will be familiar to you if you’ve used RAII patterns.

 

간단하게 생각하면... 메모리 포인터에 대해서 언어 레벨에서 관리하여

동일 포인터를 포인터 변수에 저장할 수 없도록 관리 하는 것이 소유권이라고 봐도 무방할 것 같다.

Earlier, we said that when a variable goes out of scope, Rust automatically calls the drop function and cleans up the heap memory for that variable. But Figure 4-2 shows both data pointers pointing to the same location. This is a problem: when s2 and s1 go out of scope, they will both try to free the same memory. This is known as a double free error and is one of the memory safety bugs we mentioned previously. Freeing memory twice can lead to memory corruption, which can potentially lead to security vulnerabilities.

To ensure memory safety, after the line let s2 = s1;, Rust considers s1 as no longer valid. Therefore, Rust doesn’t need to free anything when s1 goes out of scope. Check out what happens when you try to use s1 after s2 is created; it won’t work:

This code does not compile!
    let s1 = String::from("hello");
    let s2 = s1;

    println!("{}, world!", s1);
You’ll get an error like this because Rust prevents you from using the invalidated reference:

$ cargo run
   Compiling ownership v0.1.0 (file:///projects/ownership)
error[E0382]: borrow of moved value: `s1`
 --> src/main.rs:5:28
  |
2 |     let s1 = String::from("hello");
  |         -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait
3 |     let s2 = s1;
  |              -- value moved here
4 |
5 |     println!("{}, world!", s1);
  |                            ^^ value borrowed here after move
  |
  = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider cloning the value if the performance cost is acceptable
  |
3 |     let s2 = s1.clone();
  |                ++++++++

For more information about this error, try `rustc --explain E0382`.
error: could not compile `ownership` due to previous error
If you’ve heard the terms shallow copy and deep copy while working with other languages, the concept of copying the pointer, length, and capacity without copying the data probably sounds like making a shallow copy. But because Rust also invalidates the first variable, instead of being called a shallow copy, it’s known as a move. In this example, we would say that s1 was moved into s2. So, what actually happens is shown in Figure 4-4.

[링크 : https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html]

 

+

단일 소유자면 어떻게 공유를 해? 했는데 검색해보니 다행히(!)

멀티 쓰레드 환경에서의 다중 소유권 내용이 존재한다.

다만 Rc는 thread safe하지 않으니 arc를 쓰란다.

Multiple Ownership with Multiple Threads
In Chapter 15, we gave a value multiple owners by using the smart pointer Rc<T> to create a reference counted value. Let’s do the same here and see what happens. We’ll wrap the Mutex<T> in Rc<T> in Listing 16-14 and clone the Rc<T> before moving ownership to the thread.
Filename: src/main.rs

This code does not compile!
use std::rc::Rc;
use std::sync::Mutex;
use std::thread;

fn main() {
    let counter = Rc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Rc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();

            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *counter.lock().unwrap());
}
Listing 16-14: Attempting to use Rc<T> to allow multiple threads to own the Mutex<T>

Once again, we compile and get... different errors! The compiler is teaching us a lot.

$ cargo run
   Compiling shared-state v0.1.0 (file:///projects/shared-state)
error[E0277]: `Rc<Mutex<i32>>` cannot be sent between threads safely
  --> src/main.rs:11:36
   |
11 |           let handle = thread::spawn(move || {
   |                        ------------- ^------
   |                        |             |
   |  ______________________|_____________within this `[closure@src/main.rs:11:36: 11:43]`
   | |                      |
   | |                      required by a bound introduced by this call
12 | |             let mut num = counter.lock().unwrap();
13 | |
14 | |             *num += 1;
15 | |         });
   | |_________^ `Rc<Mutex<i32>>` cannot be sent between threads safely
   |
   = help: within `[closure@src/main.rs:11:36: 11:43]`, the trait `Send` is not implemented for `Rc<Mutex<i32>>`
note: required because it's used within this closure
  --> src/main.rs:11:36
   |
11 |         let handle = thread::spawn(move || {
   |                                    ^^^^^^^
note: required by a bound in `spawn`
  --> /rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/std/src/thread/mod.rs:704:8
   |
   = note: required by this bound in `spawn`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `shared-state` due to previous error

Wow, that error message is very wordy! Here’s the important part to focus on: `Rc<Mutex<i32>>` cannot be sent between threads safely. The compiler is also telling us the reason why: the trait `Send` is not implemented for `Rc<Mutex<i32>>` . We’ll talk about Send in the next section: it’s one of the traits that ensures the types we use with threads are meant for use in concurrent situations.

Unfortunately, Rc<T> is not safe to share across threads. When Rc<T> manages the reference count, it adds to the count for each call to clone and subtracts from the count when each clone is dropped. But it doesn’t use any concurrency primitives to make sure that changes to the count can’t be interrupted by another thread. This could lead to wrong counts—subtle bugs that could in turn lead to memory leaks or a value being dropped before we’re done with it. What we need is a type exactly like Rc<T> but one that makes changes to the reference count in a thread-safe way.

Atomic Reference Counting with Arc<T>
Fortunately, Arc<T> is a type like Rc<T> that is safe to use in concurrent situations. The a stands for atomic, meaning it’s an atomically reference counted type. Atomics are an additional kind of concurrency primitive that we won’t cover in detail here: see the standard library documentation for std::sync::atomic for more details. At this point, you just need to know that atomics work like primitive types but are safe to share across threads.

You might then wonder why all primitive types aren’t atomic and why standard library types aren’t implemented to use Arc<T> by default. The reason is that thread safety comes with a performance penalty that you only want to pay when you really need to. If you’re just performing operations on values within a single thread, your code can run faster if it doesn’t have to enforce the guarantees atomics provide.

Let’s return to our example: Arc<T> and Rc<T> have the same API, so we fix our program by changing the use line, the call to new, and the call to clone. The code in Listing 16-15 will finally compile and run:

Filename: src/main.rs

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();

            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *counter.lock().unwrap());
}
Listing 16-15: Using an Arc<T> to wrap the Mutex<T> to be able to share ownership across multiple threads

This code will print the following:

Result: 10
We did it! We counted from 0 to 10, which may not seem very impressive, but it did teach us a lot about Mutex<T> and thread safety. You could also use this program’s structure to do more complicated operations than just incrementing a counter. Using this strategy, you can divide a calculation into independent parts, split those parts across threads, and then use a Mutex<T> to have each thread update the final result with its part.

Note that if you are doing simple numerical operations, there are types simpler than Mutex<T> types provided by the std::sync::atomic module of the standard library. These types provide safe, concurrent, atomic access to primitive types. We chose to use Mutex<T> with a primitive type for this example so we could concentrate on how Mutex<T> works.

[링크 : https://doc.rust-lang.org/book/ch16-03-shared-state.html]

 

스마트 포인터 하니 왜 cpp가 떠오르냐..(안봤음!)

아무튼 말 장난같은데

"소유권과 빌리는 컨셉에서 레퍼런스와 스마트 포인터 사이에는 추가적인 차이점이 있다." 라는 표현이 존재한다.

소유자가 1개가 원칙이나 스마트 포인터를 통해 소유자가 1 이상일 수 도 있다로 확장이 되려나?

Smart Pointers
A pointer is a general concept for a variable that contains an address in memory. This address refers to, or “points at,” some other data. The most common kind of pointer in Rust is a reference, which you learned about in Chapter 4. References are indicated by the & symbol and borrow the value they point to. They don’t have any special capabilities other than referring to data, and have no overhead.

Smart pointers, on the other hand, are data structures that act like a pointer but also have additional metadata and capabilities. The concept of smart pointers isn’t unique to Rust: smart pointers originated in C++ and exist in other languages as well. Rust has a variety of smart pointers defined in the standard library that provide functionality beyond that provided by references. To explore the general concept, we’ll look at a couple of different examples of smart pointers, including a reference counting smart pointer type. This pointer enables you to allow data to have multiple owners by keeping track of the number of owners and, when no owners remain, cleaning up the data.

Rust, with its concept of ownership and borrowing, has an additional difference between references and smart pointers: while references only borrow data, in many cases, smart pointers own the data they point to.

Though we didn’t call them as such at the time, we’ve already encountered a few smart pointers in this book, including String and Vec<T> in Chapter 8. Both these types count as smart pointers because they own some memory and allow you to manipulate it. They also have metadata and extra capabilities or guarantees. String, for example, stores its capacity as metadata and has the extra ability to ensure its data will always be valid UTF-8.

[링크 : https://doc.rust-lang.org/book/ch15-00-smart-pointers.html]

'Programming > rust' 카테고리의 다른 글

rust mut  (0) 2023.05.25
rust visibility and privacy  (0) 2023.05.25
rust was  (0) 2023.05.20
c에서 rust 호출하기  (0) 2023.05.11
rust 실행파일  (0) 2023.05.11
Posted by 구차니
Programming/rust2023. 5. 20. 13:48

'Programming > rust' 카테고리의 다른 글

rust visibility and privacy  (0) 2023.05.25
rust 소유권  (0) 2023.05.25
c에서 rust 호출하기  (0) 2023.05.11
rust 실행파일  (0) 2023.05.11
rust if문  (0) 2023.05.11
Posted by 구차니
Programming/rust2023. 5. 11. 10:16

no_mangle을 설정하면 c에서 사용가능한 함수로 빌드 되는 듯.

Every function in your Rust-ffi API needs to have a corresponding header function.

#[no_mangle]
pub extern "C" fn rust_function() {}

would then become
void rust_function();

[링크 : https://docs.rust-embedded.org/book/interoperability/rust-with-c.html]

[링크 : https://dev.to/dandyvica/how-to-call-rust-functions-from-c-on-linux-h37]

 

mangle.. mangle이면 cpp이랑 좀 더 용이하게 붙을 느낌인데..?

$ readelf -a main | grep demangle
   387: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS rustc_demangle.9c38528e-c
   393: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS rustc_demangle.9c38528e-c
   394: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS rustc_demangle.9c38528e-c
   395: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS rustc_demangle.9c38528e-c
   400: 000000000002fc20   320 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v010H
   401: 000000000002fd60   152 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v06Pa
   402: 000000000002fe00   181 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v06Pa
   403: 000000000002fec0   202 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v06Pa
   404: 000000000002ff90    85 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v06Pa
   405: 000000000002fff0   471 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v06Pa
   406: 00000000000301d0    79 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   407: 0000000000030220   411 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   408: 00000000000303c0   411 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   409: 0000000000032a00  1868 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   410: 0000000000030560   396 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   411: 0000000000031c00  1282 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   412: 00000000000306f0   354 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   413: 0000000000030860   241 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   414: 0000000000030960   748 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   415: 0000000000032800   509 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   416: 0000000000030c50   514 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   417: 0000000000032110  1138 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   418: 0000000000030e60   152 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   419: 0000000000030f00   159 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   420: 0000000000030fa0   666 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   421: 0000000000031240   147 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   422: 0000000000031af0   260 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   423: 00000000000312e0   164 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   424: 0000000000032590   610 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   425: 0000000000033150   487 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   426: 0000000000033340   720 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   427: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS rustc_demangle.9c38528e-c
   429: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS rustc_demangle.9c38528e-c
   430: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS rustc_demangle.9c38528e-c
   492: 000000000002f460   635 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v08de
   624: 0000000000033620   802 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle6legac
   654: 0000000000031390  1878 FUNC    LOCAL  DEFAULT   14 _ZN14rustc_demangle2v07Pr
   758: 000000000002ea40   395 FUNC    GLOBAL DEFAULT   14 _ZN63_$LT$rustc_demangle.
   848: 000000000002e330  1695 FUNC    GLOBAL DEFAULT   14 _ZN14rustc_demangle8deman
   956: 0000000000033950  2970 FUNC    GLOBAL DEFAULT   14 _ZN71_$LT$rustc_demangle.
  1021: 000000000002f6e0  1332 FUNC    GLOBAL DEFAULT   14 _ZN64_$LT$rustc_demangle.
  1090: 000000000002ea30     9 FUNC    GLOBAL DEFAULT   14 _ZN14rustc_demangle8Deman
  1278: 000000000002e9d0    82 FUNC    GLOBAL DEFAULT   14 _ZN14rustc_demangle12try_
  1303: 000000000002ebd0    21 FUNC    GLOBAL DEFAULT   14 _ZN71_$LT$rustc_demangle.

'Programming > rust' 카테고리의 다른 글

rust 소유권  (0) 2023.05.25
rust was  (0) 2023.05.20
rust 실행파일  (0) 2023.05.11
rust if문  (0) 2023.05.11
rust rustup doc  (0) 2023.05.10
Posted by 구차니
Programming/rust2023. 5. 11. 10:10

dynamic link 이고

$ file *
main:    ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=989d3d9b6419e9e16be59fe589ddda8c631c30f0, with debug_info, not stripped
main.rs: C source, ASCII text

 

링크 된걸 보면 c 프로그램과 별 차이가 없긴 한데

$ ldd main
linux-vdso.so.1 (0x00007ffe605de000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007efd04cd8000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007efd04ad0000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007efd048b1000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007efd046ad000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007efd042bc000)
/lib64/ld-linux-x86-64.so.2 (0x00007efd05142000)

 

실행 파일 크기가 미친듯이 크다.

golang 처럼 rust 라이브러리 자체는 static으로 link 한건가?

$ ls -alh
합계 12M
drwxrwxr-x  2 user user 4.0K  5월 11 10:06 .
drwxrwxr-x 24 user user 4.0K  5월 11 10:05 ..
-rwxrwxr-x  1 user user  12M  5월 11 10:06 main
-rw-rw-r--  1 user user  148  5월 11 10:06 main.rs

'Programming > rust' 카테고리의 다른 글

rust was  (0) 2023.05.20
c에서 rust 호출하기  (0) 2023.05.11
rust if문  (0) 2023.05.11
rust rustup doc  (0) 2023.05.10
rust cargo new를 통한 프로젝트 생성  (0) 2023.05.09
Posted by 구차니
Programming/rust2023. 5. 11. 10:07

golang과 비슷한데

그럼에도 불구하고 최소한 condition 부분의 괄호를 경로를 띄우지 error는 아니고

중괄호 위치는 마음대로 설정할 수 있다.

 

$ cat main.rs 
fn main() 
{
let number = 3;

if (number < 5)
{
println!("condition was true");
}
else
{
println!("condition was false");
}
}

 

$ rustc main.rs 
warning: unnecessary parentheses around `if` condition
 --> main.rs:5:6
  |
5 |         if (number < 5)
  |            ^          ^
  |
  = note: `#[warn(unused_parens)]` on by default
help: remove these parentheses
  |
5 -         if (number < 5)
5 +         if number < 5
  |

warning: 1 warning emitted

 

[링크 : https://doc.rust-lang.org/book/ch03-05-control-flow.html]

'Programming > rust' 카테고리의 다른 글

c에서 rust 호출하기  (0) 2023.05.11
rust 실행파일  (0) 2023.05.11
rust rustup doc  (0) 2023.05.10
rust cargo new를 통한 프로젝트 생성  (0) 2023.05.09
rust 와 main.rs  (0) 2023.05.09
Posted by 구차니
Programming/rust2023. 5. 10. 22:49

도움말 문서 보여줌

Welcome to an overview of the documentation provided by the Rust project. This page contains links to various helpful references, most of which are available offline (if opened with rustup doc).

 

'Programming > rust' 카테고리의 다른 글

rust 실행파일  (0) 2023.05.11
rust if문  (0) 2023.05.11
rust cargo new를 통한 프로젝트 생성  (0) 2023.05.09
rust 와 main.rs  (0) 2023.05.09
rust 문서 다운로드하기(cargo)  (0) 2023.05.09
Posted by 구차니
Programming/rust2023. 5. 9. 13:32

msvc 설치하고 하니 정상적으로 잘 빌드 된다.

C:\Users\user\Desktop\study\rust\hello_cargo>cargo build
   Compiling hello_cargo v0.1.0 (C:\Users\free\Desktop\study\rust\hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 1.04s

---

에라이.. 역시 윈도우는 취미/개발용이 아니라 엔터테인먼트 용이었나!? (뜬금없이 분노중)

C:\Users\user\Desktop\study\rust>cargo new hello_cargo
     Created binary (application) `hello_cargo` package

C:\Users\user\Desktop\study\rust\hello_cargo> cd hello_cargo

C:\Users\user\Desktop\study\rust\hello_cargo>cargo build
   Compiling hello_cargo v0.1.0 (C:\Users\free\Desktop\study\rust\hello_cargo)
error: linker `link.exe` not found
  |
  = note: program not found

note: the msvc targets depend on the msvc linker but `link.exe` was not found

note: please ensure that Visual Studio 2017 or later, or Build Tools for Visual Studio were installed with the Visual C++ option.

note: VS Code is a different product, and is not sufficient.

error: could not compile `hello_cargo` due to previous error

[링크 : https://doc.rust-lang.org/book/ch01-03-hello-cargo.html]

 

cargo.toml 내용은 평범한(?) ini 스타일이네

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

 

.gitignore 파일은 /target 인걸 봐서는 /src 에는 소스 /target에는 바이너리가 생성되는 구조인듯

/target

'Programming > rust' 카테고리의 다른 글

rust if문  (0) 2023.05.11
rust rustup doc  (0) 2023.05.10
rust 와 main.rs  (0) 2023.05.09
rust 문서 다운로드하기(cargo)  (0) 2023.05.09
rust in windows  (0) 2023.05.09
Posted by 구차니