فين الملف التنفيذي بعد cargo build؟
cargo build finished but no .exe — where is the binary?العَرَض
شغّلت cargo build، الأمر خلص من غير أي خطأ:
Compiling hello v0.1.0 (/home/user/hello)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.09sوبعدين بصيت في مجلد المشروع وملقتش أي ملف تنفيذي. لو إنت جاي من ويندوز، إنت
بتدور على hello.exe — والملف موجود فعلاً بس اسمه hello من غير أي امتداد.
السبب
حاجتين مختلفتين بيحصلوا مع بعض:
الأولى: الملف مش في مجلد المشروع. cargo بيحط كل ناتج البناء في target/،
مش جنب src/. ملف الـ debug بيقع في target/debug/ واسمه هو اسم الحزمة في
Cargo.toml.
التانية: لينكس وmacOS مش بيستخدموا الامتدادات عشان يعرفوا الملف تنفيذي ولا لأ.
اللي بيحدد ده هو بِت الصلاحية x في صلاحيات الملف، مش الاسم. ويندوز هو اللي
محتاج .exe، وعلى ويندوز فعلاً cargo بيطلّع hello.exe.
الحل
بص جوه target/debug/:
$ ls -F target/debug
build/ deps/ examples/ hello* hello.d incremental/hello من غير امتداد هو الملف. علامة * اللي ls -F حطاها جنبه معناها إن
بِت التنفيذ مفعّل.
وتقدر تشغّله على طول:
$ ./target/debug/hello
Hello, world!الـ ./ في الأول مش زيادة — من غيرها الـ shell بيدوّر على أمر اسمه hello في
مسارات النظام بس، ومش بيبص في المجلد اللي إنت فيه.
إزاي تتأكد إن ده هو فعلاً
$ file target/debug/hello
target/debug/hello: ELF 64-bit LSB pie executable, x86-64, ... with debug_info, not strippedELF ... executable معناها ملف تنفيذي على لينكس. وwith debug_info, not stripped بتفسر ليه حجمه كبير — ده بناء debug، جواه معلومات كاملة للمصحّح.
ليه بيحصل ده
cargo بيعزل ناتج البناء عن الكود المصدري عن قصد. target/ بيبقى فيه ملفات
كتير جداً — نتايج وسيطة، تبعيات مترجمة، ملفات بناء تدريجي — ولو دي اتخلطت مع
src/ كان المشروع بقى فوضى، وكان لازم تكتب قواعد تجاهل معقدة في .gitignore.
عشان كده cargo new بيولّد .gitignore فيه سطر واحد بس: /target.
في الاستخدام العادي مش هتحتاج تدور على الملف أصلاً — cargo run بيبني ويشغّل
في خطوة واحدة، وبيقولك مسار الملف اللي شغّله:
Compiling hello v0.1.0 (/home/user/hello)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.09s
Running `target/debug/hello`
Hello, world!السطر Running ده هو إجابة السؤال كل مرة.
الشرح الكامل للأوامر التلاتة — build وrun وcheck — وإمتى تستخدم كل واحد،
في درس أول برنامج.
النقاش
لو عندك سؤال أو لقيت غلطة في الصفحة دي، اكتبها فيالنقاشات على GitHub. كل صفحة ليها موضوعها الخاص.