що ускладнює сказування візуального компілятора C ++ у Windows для створення бінарного виконуваного файлу Linux?
Окрім небажання робити це з боку Microsoft, абсолютно нічого. Перешкоди не технічні.
Ланцюги інструментів розробки - це лише програми, які беруть вклад і виробляють вихід. Visual C ++ виробляє збірку x86, а потім використовує ассемблер для перетворення цього файлу в об'єктний COFF. Якщо Microsoft захотіла зробити так, щоб він генерував ELF, це просто код: приходить збірка, ELF виходить. Немає нічого магічного в об’єктних файлах чи бібліотеках; вони просто краплі даних у добре зрозумілому форматі.
Зрештою, у кам'яну епоху перехресне складання було набагато складніше, тому що частіше за все ви писали б ланцюжок інструментів для своєї цільової платформи в зборі для платформи, де вона буде працювати. Це означало, що якби у світі існували архітектури VAX, M68K та Alpha, повний набір крос-компіляторів вимагатиме написання дев'яти з них, переважно з нуля. (VAX-to-VAX, VAX-to-M68K, VAX-to-Alpha, M68K-to-VAX, M68K-to-M68K тощо). Це трохи перебільшення, оскільки частини компілятора VAX можна повторно використовувати та додається до генераторів коду для кожної цілі (наприклад, VAX, M68K та Alpha, кожен написаний для VAX.)
Ця проблема усунулася, коли ми почали писати компілятори мовою, яка не була прив’язана до певного процесора, наприклад, C. Перехід цього маршруту означає, що ви записуєте всю ланцюжок інструментів один раз у C і використовуєте платформу, написану для локальної платформи. C компілятор для його побудови. (Ви часто використовуєте компілятор, щоб перекомпілювати себе після його завантаження на компілятор локальної платформи, але це ще одне обговорення.) Підсумок цього полягає в тому, що створення крос-компілятора стало по суті тим же зусиллям, що і для створення нативного компілятора на місцева платформа. Єдина істотна відмінність полягає в тому, що десь у процесі збирання ви сказали йому скласти генератор коду для вашої цільової платформи замість тієї для локальної платформи, який був би логічним вибором.
По мірі того, як розвивалася архітектура компіляторів, стало зручно просто включати та створювати всі генератори коду з продуктом та вибирати, який із них використовуватимуться під час виконання. Clang / LLVM це робить, і я впевнений, що є й інші.
Після того, як у вас є робоча ланцюжок інструментів (компілятор, асемблер, посилання), бібліотеки збираються з джерел, і в кінцевому підсумку ви отримуєте все необхідне для створення виконуваного файлу для якоїсь іншої платформи.