namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:module_std_gcc15

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
howto:module_std_gcc15 [2025-03-08 16:28] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1howto:module_std_gcc15 [2025-03-08 16:34] (aktuell) rrichter
Zeile 1: Zeile 1:
 +====== How to use C++ module std in GNU g++-15 ======
 +
 +Modules with g++15 HEAD, CMake and Ninja under Windows 10. Warning: This is experimental.
 +
 +A small demo project. Available on [[https://github.com/rene-richter/cpp_module_std_cmake_gcc15HEAD|Github]].
 +
 +How to build and execute:
 +
 +<code>
 +cd build
 +cmake -G Ninja
 +ninja
 +demo
 +</code>
 +Prerequisites:
 +
 +  * GCC 15 HEAD https://www.equation.com gcc-15-2024-1215-64.exe
 +  * CMake 3.31.3
 +  * Ninja 1.12.1
 +
 +Limitations (at the time of writing, 2025-02-21):
 +
 +  * CMake supports C++ modules for Ninja generator only
 +  * CMake tells Ninja nothing about module std. Hack: extra library ''%%module_std%%'' in ''%%CMakeList.txt%%''.
 +
 +Some lines in source file ''%%gnu/std.cc%%'' (copied from ''%%MinGW/include/c++/15.0.0/bits/std.cc%%'') had to be commented out:
 +
 +<code cpp>
 +// using std::aligned_alloc;
 +// using std::timespec;
 +// using std::timespec_get;
 +// using std::mbrtoc8;
 +// using std::c8rtomb;
 +</code>
 +Sadly, newer weekly build compiler ''%%https://www.equation.com/ftpdir/gcc-15-20250202-64.exe%%'' resulted in compilation error: ''%%exposes TU-local entity%%''. :-(
 +
 +==== CMake ====
 +
 +<code>
 +cmake_minimum_required(VERSION 3.31)
 +
 +project(
 +    compile_with_module_std
 +    VERSION 0.0.1
 +    LANGUAGES CXX)
 +
 +# temporary hack for GCC g++15.0 HEAD https://www.equation.com gcc-15-20241215-64.exe
 +# to remove when g++ & CMake know about module std
 +add_library(module_std)
 +
 +target_sources(module_std
 +    PUBLIC
 +        FILE_SET CXX_MODULES FILES
 +            gnu/std.cc # modified from MinGW\include\c++\15.0.0\bits\std.cc
 +)
 +target_compile_features(module_std PUBLIC cxx_std_26)
 +# also to remove (see below):
 +# target_link_libraries(...XYZ... PRIVATE module_std)
 +
 +# another hack for advanced features like std::print(), std::stacktrace, etc in g++14 and g++15.0 HEAD:
 +# target_link_libraries(...XYZ... PRIVATE stdc++exp)
 +
 +add_library(my_module)
 +
 +target_sources(my_module
 +    PUBLIC
 +        FILE_SET CXX_MODULES FILES
 +            src/my_module.cpp 
 +)
 +target_compile_features(my_module PUBLIC cxx_std_26)
 +target_link_libraries(my_module PRIVATE module_std)
 +
 +add_executable(demo src/demo.cpp)
 +target_compile_features(demo PUBLIC cxx_std_26)
 +target_link_libraries(demo PRIVATE module_std)
 +target_link_libraries(demo PRIVATE my_module)
 +target_link_libraries(demo PRIVATE stdc++exp)
 +
 +</code>
 +==== C++ code ====
 +
 +Modular ''%%src/my_module.cpp%%''
 +
 +<code cpp>
 +export module my_first_module;
 +import std;
 +
 +export namespace something
 +{
 +
 +std::string hello(std::string name)
 +{
 +    return "Hello, " + name + '!';
 +}   
 +
 +} // end namespace something
 +</code>
 +used in ''%%demo.cpp%%'':
 +
 +<code cpp>
 +import std;
 +import my_first_module;
 +
 +int main()
 +{
 +    std::println("{}", something::hello("modules"));
 +}
 +</code>
  

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki