namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:module_std_gcc15

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

How to build and execute:

cd build
cmake -G Ninja
ninja
demo

Prerequisites:

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:

// using std::aligned_alloc;
// using std::timespec;
// using std::timespec_get;
// using std::mbrtoc8;
// using std::c8rtomb;

Sadly, newer weekly build compiler https://www.equation.com/ftpdir/gcc-15-20250202-64.exe resulted in compilation error: exposes TU-local entity. :-(

CMake

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)

C++ code

Modular src/my_module.cpp

export module my_first_module;
import std;
 
export namespace something
{
 
std::string hello(std::string name)
{
    return "Hello, " + name + '!';
}   
 
} // end namespace something

used in demo.cpp:

import std;
import my_first_module;
 
int main()
{
    std::println("{}", something::hello("modules"));
}
howto/module_std_gcc15.txt · Zuletzt geändert: 2025-03-08 16:34 von rrichter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki