Přinejmenším pro knihovnu Crypto++ to nefunguje (ověřeno :-( ). Takže u kódu c++ je méně pravděpodobné, že to bude fungovat, zatímco čistý kód c by pravděpodobně odkazoval OK.
EDIT:Problém se začal objevovat u Mac OS X 10.9 Mavericks a Xcode-5, které změnily výchozí knihovnu C++ pro clang z libstdc++ na libc++. V systému Mac OS X 10.8 a starším neexistovalo.
Řešení se zdá být:pokud potřebujete zkompilovat kód C++ pomocí clang a propojit jej s knihovnou kompilovanou gcc, použijte "clang++ -stdlib=libstdc++". Propojení je úspěšné a výsledný binární soubor běží správně.
UPOZORNĚNÍ:Zdá se, že to nefunguje jinak:i když můžete sestavit knihovnu zkompilovanou pomocí "clang++ -stdlib=libstdc++" a propojit s ní kód zkompilovaný gcc, tento kód se zhroutí se SEGV. Zatím jsem našel jediný způsob, jak se propojit s knihovnou kompilovanou clang, kompilace vašeho kódu pomocí clang, nikoli gcc.
UPRAVIT2 :Zdá se, že GCC-12 obsahuje -stdlib=
vlajka. Kompilace s g++ -stdlib=libc++
vytvoří Clang++
-kompatibilní objektové soubory. Velmi pěkné.
Ano, obvykle můžete použít clang
s GCC kompilovanými knihovnami (a naopak, použijte gcc
s kompilovanými knihovnami CLANG), protože ve skutečnosti není relevantní kompilace, ale propojení. Možná budete mít smůlu a dostanete nepříjemná překvapení.
V zásadě můžete mít určité závislosti na verzi libstdc++
slouží k propojení příslušných knihoven (pokud jsou kódovány v C++). Ve skutečnosti na tom obvykle moc nezáleží.
V C++ může být teoreticky problém s pozměněním názvů (mohou existovat některé rohové případy, dokonce i nekompatibilita mezi dvěma různými verzemi g++
). Opět, v praxi to obvykle není problém.
Obvykle tedy můžete míchat CLANG (dokonce i jeho různé, ale blízké verze) s GCC, ale můžete mít nepříjemná překvapení. Co by se mělo očekávat od jakéhokoli kompilátoru C++ (ať už je to CLANG nebo GCC), je pouze schopnost zkompilovat a propojit celý software (a všechny knihovny) pomocí stejného kompilátoru a verze (a to zahrnuje stejnou implementaci standardní knihovny C++ ). To je důvod, proč upgradovat kompilátor v distribuci je hodně práce:tvůrci distribuce musí zajistit, aby se všechny balíčky zkompilovaly dobře (a jsou překvapení!).
Dejte si pozor, na verzi libstdc++ záleží. Komunity Clang i GCC tvrdě pracují na tom, aby bylo jeho ABI kompatibilní pro upgrady kompilátoru, ale existují i jemné rohové případy. Přečtěte si dokumentaci vaší konkrétní a specifické implementace standardní knihovny C++. Tyto rohové případy by mohly vysvětlit záhadné pády při použití dobré binární knihovny C++ (zkompilované s GCC 5) ve vašem kódu zkompilovaném s GCC 8. Chyba není v knihovně, ale ABI se vyvinulo nekompatibilně.