Cześć, da się skompilować mały program C++ z libcmini, bez linkowania z mintlib.
Nie potrzeba osobnej biblioteki libcmini "dla kompilatora C++". Kod kompiluje
, a libcmini dostarcza kod startowy i funkcje C. W linkowaniu trzeba wyłączyć domyślne biblioteki przez
, podać
, a na końcu
.
U mnie, przy GCC 15.2.0 i libcmini dla mintelf, poniższy program daje HELLO.PRG o rozmiarze 4565 bajtów. Sprawdziłem kompilację i format Atari PRG dla MC68000; nie sprawdzałem jeszcze działania na prawdziwym ST.
Układ katalogów
katalog-glowny/
toolchain/
mingw64/
bin/
lib/
m68k-atari-mintelf/
libcmini/
usr/
include/
lib/
crt0.o
libcmini.a
projects/
hello-cpp/
main.cpp
build.ps1
Archiwa GCC i binutils dla Windows po rozpakowaniu tworzą katalog
. Pakiet libcmini dla mintelf tworzy katalog
. Kompilator na Windows potrzebuje też swoich DLL w katalogu
lub w
.
projects/hello-cpp/main.cpp
#include <stdio.h>
class Greeting {
public:
explicit Greeting(const char* message) : message_(message) {}
void print() const {
puts(message_);
}
private:
const char* message_;
};
int main() {
const Greeting hello("Hello World from C++ on Atari ST!");
hello.print();
return 0;
}
projects/hello-cpp/build.ps1
$ErrorActionPreference = 'Stop'
$project = $PSScriptRoot
$root = [System.IO.Path]::GetFullPath((Join-Path $project '..\..'))
$bin = Join-Path $root 'toolchain\mingw64\bin'
$mini = Join-Path $root 'libcmini\usr'
$compiler = Join-Path $bin 'm68k-atari-mintelf-g++.exe'
$objdump = Join-Path $bin 'm68k-atari-mintelf-objdump.exe'
$output = Join-Path $project 'HELLO.PRG'
foreach ($file in @($compiler, $objdump, (Join-Path $mini 'lib\crt0.o'), (Join-Path $mini 'lib\libcmini.a'))) {
if (-not (Test-Path -LiteralPath $file -PathType Leaf)) {
throw "Brak wymaganego pliku: $file"
}
}
$oldPath = $env:PATH
try {
$env:PATH = "$bin;$oldPath"
$arguments = @(
'-m68000', '-std=c++17', '-Os',
'-fno-exceptions', '-fno-rtti', '-fno-threadsafe-statics',
'-fno-unwind-tables', '-fno-asynchronous-unwind-tables',
'-ffunction-sections', '-fdata-sections',
'-I', (Join-Path $mini 'include'),
'-nostdlib', (Join-Path $mini 'lib\crt0.o'),
(Join-Path $project 'main.cpp'),
'-o', $output,
'-Wl,--gc-sections', '-s',
'-L', (Join-Path $mini 'lib'), '-lcmini', '-lgcc'
)
& $compiler @arguments
if ($LASTEXITCODE -ne 0) { throw "Kompilacja nie powiodla sie (kod $LASTEXITCODE)." }
$header = [System.IO.File]::ReadAllBytes($output)
if ($header.Length -lt 28 -or $header[0] -ne 0x60 -or $header[1] -ne 0x1a) {
throw 'Plik wynikowy nie ma naglowka Atari PRG.'
}
$format = (& $objdump -f $output | Out-String)
if ($LASTEXITCODE -ne 0 -or $format -notmatch 'elf32-atariprg') {
throw 'Plik wynikowy nie zostal rozpoznany jako Atari PRG.'
}
$size = (Get-Item -LiteralPath $output).Length
Write-Host "Gotowe: $output ($size bajtow, Atari PRG, MC68000)"
}
finally {
$env:PATH = $oldPath
}
Uruchomienie: w PowerShell przejść do
i wykonać
.
Ograniczenie: to mały program napisany w C++17, ale tekst wypisuje przez
z libcmini. Skrypt nie linkuje pełnego libstdc++; wyłącza też wyjątki i RTTI. Użycie
lub innych cięższych części biblioteki standardowej może ponownie zwiększyć rozmiar PRG.
Gdybyś potrzebował:
GCC i binutils dla m68k-atari-mintelf
Repozytorium libcmini
Gotowy pakiet libcmini dla mintelf