# CXX-Modules: import std does still not work on OSX with g++-15

**URL:** https://discourse.cmake.org/t/cxx-modules-import-std-does-still-not-work-on-osx-with-g-15/15265
**Category:** Development
**Tags:** os:macos, gen:ninja
**Created:** [October 26, 2025, 11:28pm UTC](https://discourse.cmake.org/t/cxx-modules-import-std-does-still-not-work-on-osx-with-g-15/15265 "2025-10-26T23:28:07Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![ClausKlein](https://discourse.cmake.org/user_avatar/discourse.cmake.org/clausklein/32/352_2.png) [@ClausKlein](https://discourse.cmake.org/u/ClausKlein)
#### Post date: [October 26, 2025, 11:28pm UTC](https://discourse.cmake.org/t/cxx-modules-import-std-does-still-not-work-on-osx-with-g-15/15265/1 "2025-10-26T23:28:07Z")

</div>

I have this simple example copied form [https://www.kitware.com/import-std-in-cmake-3-30/:](https://www.kitware.com/import-std-in-cmake-3-30/:)

```cmake
# CMake 3.30 is required for C++23 `import std` support; we use 3.29.20240416
# here so that in-development versions satisfy it.
cmake_minimum_required(VERSION 4.0...4.2)

# Set experimental flag to enable `import std` support from CMake.
# This must be enabled before C++ language support.
# set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD # This specific value changes as experimental support evolves. See
# # `Help/dev/experimental.rst` in the CMake source corresponding to
# # your CMake build for the exact value to use.
# "a9e1cf81-9932-4810-974b-6eccaf14e457"
# )
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444")

# C++ needs to be enabled.
project(import_std LANGUAGES CXX)

# Tell CMake that we explicitly want `import std`. This will initialize the
# property on all targets declared after this to 1
set(CMAKE_CXX_MODULE_STD 1)

# Make a library.
add_library(uses_std STATIC)
# Add sources.
target_sources(uses_std PRIVATE uses_std.cxx)
# Tell CMake we're using C++23 but only C++20 is needed to consume it.
target_compile_features(uses_std PRIVATE cxx_std_23 INTERFACE cxx_std_20)

# Make an executable.
add_executable(main)
# Note that this source is *not* allowed to `import std` as it ends up
# with only C++20 support due to the `uses_std` INTERFACE requirements.
target_sources(main PRIVATE main.cxx)
target_link_libraries(main PRIVATE uses_std)

enable_testing()
add_test(NAME main COMMAND main)

```

### but it results in linker errors:

```bash
bash-5.3$ CXX=g++-15 cmake -G Ninja -S . -B build --fresh 
-- The CXX compiler identification is GNU 15.2.0
-- Checking whether CXX compiler has -isysroot
-- Checking whether CXX compiler has -isysroot - yes
-- Checking whether CXX compiler supports OSX deployment target flag
-- Checking whether CXX compiler supports OSX deployment target flag - yes
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/local/bin/g++-15 - skipped
-- Detecting CXX compile features
CMake Warning (dev) at /Users/clausklein/.local/share/cmake-4.2/Modules/Compiler/CMakeCommonCompilerMacros.cmake:248 (cmake_language):
  CMake's support for `import std;` in C++23 and newer is experimental. It
  is meant only for experimentation and feedback to CMake developers.
Call Stack (most recent call first):
  /Users/clausklein/.local/share/cmake-4.2/Modules/CMakeDetermineCompilerSupport.cmake:113 (cmake_create_cxx_import_std)
  /Users/clausklein/.local/share/cmake-4.2/Modules/CMakeTestCXXCompiler.cmake:83 (CMAKE_DETERMINE_COMPILER_SUPPORT)
  CMakeLists.txt:15 (project)
This warning is for project developers. Use -Wno-dev to suppress it.

-- Detecting CXX compile features - done
-- Configuring done (1.0s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/clausklein/Workspace/cpp/cxx20/fmt-module/example/build
bash-5.3$ ninja -C build -v
ninja: Entering directory `build'
[1/12] /usr/local/bin/g++-15 -std=gnu++23 -fmodule-only -E -x c++ /usr/local/Cellar/gcc/15.2.0/include/c++/15/bits/std.compat.cc -MT CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/1ccb32d972a2.bmi.ddi -MD -MF CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/1ccb32d972a2.bmi.ddi.d -fmodules-ts -fdeps-file=CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/1ccb32d972a2.bmi.ddi -fdeps-target=CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/1ccb32d972a2.bmi -fdeps-format=p1689r5 -o CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/1ccb32d972a2.bmi.ddi.i
[2/12] /usr/local/bin/g++-15 -std=gnu++23 -fmodule-only -E -x c++ /usr/local/Cellar/gcc/15.2.0/include/c++/15/bits/std.cc -MT CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/67f69854274c.bmi.ddi -MD -MF CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/67f69854274c.bmi.ddi.d -fmodules-ts -fdeps-file=CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/67f69854274c.bmi.ddi -fdeps-target=CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/67f69854274c.bmi -fdeps-format=p1689r5 -o CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/67f69854274c.bmi.ddi.i
[3/12] /Users/clausklein/.local/bin/cmake -E cmake_ninja_dyndep --tdi=CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/CXXDependInfo.json --lang=CXX --modmapfmt=gcc --dd='CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/CXX.dd' @'CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/CXX.dd'.rsp
[4/12] /usr/local/bin/g++-15 -std=gnu++23 -E -x c++ /Users/clausklein/Workspace/cpp/cxx20/fmt-module/example/uses_std.cxx -MT CMakeFiles/uses_std.dir/uses_std.cxx.o.ddi -MD -MF CMakeFiles/uses_std.dir/uses_std.cxx.o.ddi.d -fmodules-ts -fdeps-file=CMakeFiles/uses_std.dir/uses_std.cxx.o.ddi -fdeps-target=CMakeFiles/uses_std.dir/uses_std.cxx.o -fdeps-format=p1689r5 -o CMakeFiles/uses_std.dir/uses_std.cxx.o.ddi.i
[5/12] /Users/clausklein/.local/bin/cmake -E cmake_ninja_dyndep --tdi=CMakeFiles/uses_std.dir/CXXDependInfo.json --lang=CXX --modmapfmt=gcc --dd=CMakeFiles/uses_std.dir/CXX.dd @CMakeFiles/uses_std.dir/CXX.dd.rsp
[6/12] /usr/local/bin/g++-15 -std=gnu++20 -E -x c++ /Users/clausklein/Workspace/cpp/cxx20/fmt-module/example/main.cxx -MT CMakeFiles/main.dir/main.cxx.o.ddi -MD -MF CMakeFiles/main.dir/main.cxx.o.ddi.d -fmodules-ts -fdeps-file=CMakeFiles/main.dir/main.cxx.o.ddi -fdeps-target=CMakeFiles/main.dir/main.cxx.o -fdeps-format=p1689r5 -o CMakeFiles/main.dir/main.cxx.o.ddi.i
[7/12] /Users/clausklein/.local/bin/cmake -E cmake_ninja_dyndep --tdi=CMakeFiles/main.dir/CXXDependInfo.json --lang=CXX --modmapfmt=gcc --dd=CMakeFiles/main.dir/CXX.dd @CMakeFiles/main.dir/CXX.dd.rsp
[8/12] ccache /usr/local/bin/g++-15 -std=gnu++20 -MD -MT CMakeFiles/main.dir/main.cxx.o -MF CMakeFiles/main.dir/main.cxx.o.d -fmodules-ts -fmodule-mapper=CMakeFiles/main.dir/main.cxx.o.modmap -MD -fdeps-format=p1689r5 -x c++ -o CMakeFiles/main.dir/main.cxx.o -c /Users/clausklein/Workspace/cpp/cxx20/fmt-module/example/main.cxx
[9/12] /usr/local/bin/g++-15 -std=gnu++23 -fmodule-only -MD -MT 'CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/67f69854274c.bmi' -MF CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/67f69854274c.bmi.d -fmodules-ts -fmodule-mapper=CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/67f69854274c.bmi.modmap -MD -fdeps-format=p1689r5 -x c++ -o 'CMakeFiles/ __CMAKE__ CXX23@synth_8e2c785ad87e.dir/67f69854274c.bmi' -c /usr/local/Cellar/gcc/15.2.0/include/c++/15/bits/std.cc
[10/12] ccache /usr/local/bin/g++-15 -std=gnu++23 -MD -MT CMakeFiles/uses_std.dir/uses_std.cxx.o -MF CMakeFiles/uses_std.dir/uses_std.cxx.o.d -fmodules-ts -fmodule-mapper=CMakeFiles/uses_std.dir/uses_std.cxx.o.modmap -MD -fdeps-format=p1689r5 -x c++ -o CMakeFiles/uses_std.dir/uses_std.cxx.o -c /Users/clausklein/Workspace/cpp/cxx20/fmt-module/example/uses_std.cxx
[11/12] : && /Users/clausklein/.local/bin/cmake -E rm -f libuses_std.a && /usr/bin/ar qc libuses_std.a CMakeFiles/uses_std.dir/uses_std.cxx.o && /usr/bin/ranlib libuses_std.a && /Users/clausklein/.local/bin/cmake -E touch libuses_std.a && :
[12/12] : && /usr/local/bin/g++-15 -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/main.dir/main.cxx.o -o main libuses_std.a && :
FAILED: [code=1] main 
: && /usr/local/bin/g++-15 -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/main.dir/main.cxx.o -o main libuses_std.a && :
Undefined symbols for architecture x86_64:
  "initializer for module std", referenced from:
      __static_initialization_and_destruction_0() in libuses_std.a[2](uses_std.cxx.o)
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
bash-5.3$ 

```

What is wrong or is missing?

---

<div class="post-metadata">

### Author: ![fenrir](https://discourse.cmake.org/user_avatar/discourse.cmake.org/fenrir/32/734_2.png) [@fenrir](https://discourse.cmake.org/u/fenrir)
#### Post date: [October 27, 2025, 7:46am UTC](https://discourse.cmake.org/t/cxx-modules-import-std-does-still-not-work-on-osx-with-g-15/15265/2 "2025-10-27T07:46:28Z")

</div>

I’ve seen such errors with g+±15 on Linux, when tried to use symbol hiding. Even found a g++ bug for it.

---

<div class="post-metadata">

### Author: ![ben.boeckel](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/b/ea5d25/32.png) [@ben.boeckel](https://discourse.cmake.org/u/ben.boeckel)
#### Post date: [October 27, 2025, 1:08pm UTC](https://discourse.cmake.org/t/cxx-modules-import-std-does-still-not-work-on-osx-with-g-15/15265/3 "2025-10-27T13:08:19Z")

</div>

Here is the GCC bug:

> **[105397 – C++ modules vs -fvisibility option](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105397)**

Until this is fixed, you cannot use `-fvisibility=hidden` with `PUBLIC` modules in shared libraries.

---

<div class="post-metadata">

### Author: ![ben.boeckel](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/b/ea5d25/32.png) [@ben.boeckel](https://discourse.cmake.org/u/ben.boeckel)
#### Post date: [October 27, 2025, 1:09pm UTC](https://discourse.cmake.org/t/cxx-modules-import-std-does-still-not-work-on-osx-with-g-15/15265/4 "2025-10-27T13:09:09Z")

</div>

However, I don’t see the flag used here. Something else is going wrong.

---

<div class="post-metadata">

### Author: ![fenrir](https://discourse.cmake.org/user_avatar/discourse.cmake.org/fenrir/32/734_2.png) [@fenrir](https://discourse.cmake.org/u/fenrir)
#### Post date: [October 27, 2025, 1:46pm UTC](https://discourse.cmake.org/t/cxx-modules-import-std-does-still-not-work-on-osx-with-g-15/15265/5 "2025-10-27T13:46:37Z")

</div>

I brought this up as I wasn’t sure what could be hidden in the \*.rsp files

---

<div class="post-metadata">

### Author: ![ben.boeckel](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/b/ea5d25/32.png) [@ben.boeckel](https://discourse.cmake.org/u/ben.boeckel)
#### Post date: [October 27, 2025, 2:09pm UTC](https://discourse.cmake.org/t/cxx-modules-import-std-does-still-not-work-on-osx-with-g-15/15265/6 "2025-10-27T14:09:58Z")

</div>

Those are given to the collation steps; the compiler lines are fully present here.
