diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 3f8d54b8..410f04d8 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -222,11 +222,23 @@ class Extension { $config = (new SPCConfigUtil($this->builder))->config([$this->getName()], array_map(fn ($l) => $l->getName(), $this->builder->getLibs())); [$staticLibs, $sharedLibs] = $this->splitLibsIntoStaticAndShared($config['libs']); - FileSystem::replaceFileRegex( - $this->source_dir . '/Makefile', - '/^(.*_SHARED_LIBADD\s*=.*)$/m', - clean_spaces("$1 {$staticLibs} {$sharedLibs}") - ); + $lstdcpp = str_contains($sharedLibs, '-lstdc++') ? '-lstdc++' : ''; + + $makefileContent = file_get_contents($this->source_dir . '/Makefile'); + + if (preg_match('/^(.*_SHARED_LIBADD\s*=\s*)(.*)$/m', $makefileContent, $matches)) { + $prefix = $matches[1]; + $currentLibs = trim($matches[2]); + $newLibs = trim("{$currentLibs} {$staticLibs} {$lstdcpp}"); + $deduplicatedLibs = deduplicate_flags($newLibs); + + FileSystem::replaceFileRegex( + $this->source_dir . '/Makefile', + '/^(.*_SHARED_LIBADD\s*=.*)$/m', + $prefix . $deduplicatedLibs + ); + } + if ($objs = getenv('SPC_EXTRA_RUNTIME_OBJECTS')) { FileSystem::replaceFileRegex( $this->source_dir . '/Makefile', diff --git a/src/globals/functions.php b/src/globals/functions.php index 71127960..c8c40b68 100644 --- a/src/globals/functions.php +++ b/src/globals/functions.php @@ -245,6 +245,16 @@ function clean_spaces(string $string): string return trim(preg_replace('/\s+/', ' ', $string)); } +function deduplicate_flags(string $flags): string +{ + $tokens = preg_split('/\s+/', trim($flags)); + + // Reverse, unique, reverse back - keeps last occurrence of duplicates + $deduplicated = array_reverse(array_unique(array_reverse($tokens))); + + return implode(' ', $deduplicated); +} + /** * Register a callback function to handle keyboard interrupts (Ctrl+C). *