LINUX.ORG.RU

Rust и Makefile, как?

 


0

3
$ echo 'fn main() {}' > main.rs
$ rustc --emit=obj main.rs 
$ rustc main.o -o main
error: couldn't read main.o: stream did not contain valid UTF-8
error: aborting due to previous error
$ cc main.o
/usr/bin/ld: main.o: in function `std::rt::lang_start' ... undefined reference to `std::rt::lang_start_internal'

Есть ли способ узнать что мне именно нужно линковать сейчас?

★★★★★

Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от monk

Даже крошечный файл компилируется 8 секунд.

Как уже сказали выше - он нифига не крошечный. Именно поэтому нужны модули (или крейты на растосленге) - мы оброачиваем в них логически законченные сущности, std, boost, … . Но модули это не замена хидеров/имплементаций, они существуют параллельно и друг друга не исключают. И до модулей были PCH.

А в разумном варианте, когда параллельных потоков пара десятков, а файлов пара тысяч (как при компиляции ядра), повторный разбор заголовков съест больше времени, чем будет выигрыш от параллельности.

Из-за зависимостей ты даже не сможешь полностью заюзать в расте мощности одного суперкомпьютера со 100500 потоками, это очевидно. Проект, правильно обернутый в модули в нужных местах (сторониие зависимости) и тело на обычных хидерах/имплементациях будет быстрее. И в полседнем случае всегда есть возможность ускорить через отправку заданий другим компьютерам, в расте же такой возможности нет, ни через более многоядерный ЦП, ни через доп компы, потолок будет достигнут весьма быстро из-за зависимостей

kvpfs_2
()
Ответ на: комментарий от grem

Так я и пишу, что идея системы с хидерами и реализациями не самая лучшая. Приходится в каждом крохотном файле повторно компилировать мегабайты кода. В системах с модулями (хоть паскале, хоть расте) этой проблемы нет.

monk ★★★★★
()
Ответ на: комментарий от monk

Эта проблема не решается в паскале и расте, ты не можешь скомпилировать шаблонный код не зная его кода. Если взять обычный код на С, то там нету такой проблемы.

MOPKOBKA ★★★★★
() автор топика
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

Эта проблема не решается в паскале и расте, ты не можешь скомпилировать шаблонный код не зная его кода.

Есть std::collections.

Можно писать «шаблонные» типы

let mut map: HashMap<&str, i32> = HashMap::new();

При этом не приходится в каждом файле перекомпилировать весь HashMap.

Можно в одном крейте описать шаблонный тип, а в другом использовать.

monk ★★★★★
()
Ответ на: комментарий от monk

При этом не приходится в каждом файле перекомпилировать весь HashMap.

И как по твоему компилятор создает шаблонные методы HashMap для каждого индивидуального типа?

MOPKOBKA ★★★★★
() автор топика
Ответ на: комментарий от MOPKOBKA

И чем это отличается от pch?

Тем, что в заголовках может встречаться произвольный код. Тем, что, насколько я помню, pch (stdafx) должен быть один. Тем, что этот pch, в отличие от rlib, фактически нельзя использовать даже с другими ключами компилятора.

monk ★★★★★
()
Ответ на: комментарий от monk

Тем, что в заголовках может встречаться произвольный код.

А в шаблонной функции Rust произвольного кода нету?

Тем, что, насколько я помню, pch (stdafx) должен быть один.

Это какие то виндовые приколы.

Тем, что этот pch, в отличие от rlib, фактически нельзя использовать даже с другими ключами компилятора.

rlib тоже https://users.rust-lang.org/t/how-to-use-compiled-rust-library-file-rlib-file...

MOPKOBKA ★★★★★
() автор топика
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

А в шаблонной функции Rust произвольного кода нету?

Нет. Там строго определённый код, а не произвольный, зависящий от значений макропеременных и макросов.

Это какие то виндовые приколы.

Only one precompiled header can be used in a particular compilation. (https://gcc.gnu.org/onlinedocs/gcc/gcc-command-options/using-precompiled-headers.html).

rlib тоже

Вроде ограничения на то, что rlib обязан быть собран с теми же ключами оптимизации, что и используемая программа, отсутствует.

К тому же, если rlib не подходит, он будет пересобран. Если pch не подходит, то он будет выброшен: «For all of these except the last, the compiler automatically ignores the precompiled header if the conditions aren’t met.» (https://gcc.gnu.org/onlinedocs/gcc/gcc-command-options/using-precompiled-headers.html).

monk ★★★★★
()
Ответ на: комментарий от monk

Нет. Там строго определённый код, а не произвольный, зависящий от значений макропеременных и макросов.

Это ложь, конечно оно зависит от кучи опций как rust, так и библиотек к которым вызывался bindgen. В pascal тоже есть ifdef.

Only one precompiled header can be used in a particular compilation.

Это про 1 .c = 1 .h, а не про один .h на весь проект. Ну может ты это и имел виду.

К тому же, если rlib не подходит, он будет пересобран.

Это статическая библиотека, из чего ты ее собрался пересобирать?

MOPKOBKA ★★★★★
() автор топика
Последнее исправление: MOPKOBKA (всего исправлений: 3)
Ответ на: комментарий от MOPKOBKA

Это про 1 .c = 1 .h, а не про один .h на весь проект. Ну может ты это и имел виду.

Да. Я в том смысле, что если у одного include <array>, у другого include <iostream>, а у третьего и то и другое, компилировать придётся каждую комбинацию.

Это ложь, конечно оно зависит от кучи опций как rust

В Си++

#define S int
#include "prog.hpp"

и

#define S long
#include "prog.hpp"

могут выдать существенно разный результат заголовочного файла. Что в Rust написать перед use, чтобы изменился результат крейта?

Это статическая библиотека, из чего ты ее собрался пересобирать?

Из исходников рядом. Также как pch из хидеров. Только pch надо отдельной командой пересобирать, а rlib автоматически.

monk ★★★★★
()
Ответ на: комментарий от monk

могут выдать существенно разный результат заголовочного файла. Что в Rust написать перед use, чтобы изменился результат крейта?

https://doc.rust-lang.org/reference/conditional-compilation.html#the-cfg-attr...

Из исходников рядом. Также как pch из хидеров. Только pch надо отдельной командой пересобирать, а rlib автоматически.

Кто его будет автоматически пересобирать? Какой нибудь Cargo, в С++ за этим будет следить CMake https://cmake.org/cmake/help/latest/command/target_precompile_headers.html

MOPKOBKA ★★★★★
() автор топика
Последнее исправление: MOPKOBKA (всего исправлений: 2)