Heim > Artikel > Backend-Entwicklung > Warum kann Clang mit libc im C 0x-Modus Boost::Program_Options nicht verknüpfen?
Warum Clang mit libc im C 0x-Modus nicht verknüpft werden kann Boost::Program_Options-Beispiel
Das angegebene Snippet zeigt ein Problem beim Kompilierungsversuch und verknüpfen Sie boost::program_options mit clang unter Verwendung von libc in C 0x Modus.
Problemanalyse
Der Kompilierungsfehler ist auf die Inkompatibilität zwischen libc und libstdc zurückzuführen, der von g implementierten Standardstandardbibliothek. libc verwendet unterschiedliche Implementierungsdetails für std::string und führt einen ABI-Unterschied (Application Binary Interface) von libstdc ein.
Lösung
Um dieses Problem zu beheben, ist es notwendig um Boost mithilfe von clang mit der Flagge -stdlib=libc neu zu erstellen. Dadurch wird sichergestellt, dass die Boost-Bibliotheken mit derselben Standardbibliothek kompiliert werden, mit der die ausführbare Datei verknüpft wird. Es harmonisiert die ABI von std::string über die Boost-Bibliotheken und das zu kompilierende Programm hinweg.
Technische Erklärung
libc nutzt Inline-Namespaces, um die ABI von std zu ändern: :string, ohne seine API zu ändern. Dadurch entsteht eine wahrgenommene Diskrepanz zwischen den beiden Bibliotheken, wobei std::string von libstdc und std::__1::string von libc vom Linker als unterschiedliche Datenstrukturen behandelt werden.
Durch Neuaufbau von Boost mit dem entsprechenden Standard In der Bibliothek stimmen die Symboldefinitionen für boost::program_options mit denen überein, die vom Linker erwartet werden, was eine erfolgreiche Verknüpfung ermöglicht.
Das obige ist der detaillierte Inhalt vonWarum kann Clang mit libc im C 0x-Modus Boost::Program_Options nicht verknüpfen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!