GNU/Linux >> Znalost Linux >  >> Linux

Může Clang kompilovat kód s GCC zkompilovaným .a libs?

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ě.


Linux
  1. 32bitová podpora životnosti:Křížová kompilace s GCC

  2. Můžete použít kotvy ^ $ s Ls?

  3. Jak zkompilovat 32bitový binární soubor na 64bitovém linuxovém stroji s gcc/cmake

  1. zápasí s c++ IDE na linuxu

  2. C/C++ s GCC:Statické přidávání zdrojových souborů do spustitelného souboru/knihovny

  3. Nelze sestavit příklad z vyrovnávacích pamětí protokolu Google

  1. Propojení sdílené knihovny s jinou sdílenou knihovnou v linuxu

  2. Aplikace C++ končí s ukončovacím kódem 143 - co to znamená?

  3. Jak zkompilovat kód Windows Visual C++ na Linuxu