Błąd `The "foo" target contains C++ module sources which are not supported by the generator`

0

Mam wersje cmake 3.26.4.
Mam jak na razie dwa pliki, tak aby sprawdzic czy dziala - main.cxx i foo.cxx. main.cxx importuje module z foo.cxx i wypisuje "Hello, World!"

Problem mam z plikiem CMakeLists.txt, jego zawartość:

cmake_minimum_required(VERSION 3.26)
project(modules CXX)

set(CMAKE_CXX_STANDARD 20)# turn on the dynamic depends for ninja
set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1)

# turn on the experimental API
set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API  "2182bf5c-ef0d-489a-91da-49dbc3090d2a")

add_library(foo STATIC)
target_sources(
    foo PRIVATE
    FILE_SET cxx_modules TYPE CXX_MODULES FILES
    foo.cxx
)
target_compile_features(foo PUBLIC cxx_std_20)

add_executable(hello main.cxx)
target_link_libraries(hello PRIVATE foo)
target_compile_features(hello PRIVATE cxx_std_20)

Niestety, po próbie odpalenia dostaje blad:

CMake Warning (dev) at CMakeLists.txt:11 (target_sources):
  CMake's C++ module support is experimental.  It is meant only for
  experimentation and feedback to CMake developers.
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring done (0.0s)
CMake Error in CMakeLists.txt:
  The "foo" target contains C++ module sources which are not supported by the
  generator
1

Wszystko jest napisane w informacji o błędzie:

The "foo" target contains C++ module sources which are not supported by the  generator

Czyli, użyty generator nie wspiera modułów c++.
W CMakeLists.txt w komentarzu jest napisane:

# turn on the dynamic depends for ninja

Z tego wszystkiego wynika, że powinieneś użyć odpowiedniego generatora

cmake -GNinja
2

Watek na stackoverflow
https://stackoverflow.com/questions/57300495/how-to-use-c20-modules-with-cmake
nawet przykład jest na github

3

Pierwsze co mi się rzuca w oczy to złe rozszerzenia plików.
AFAIK źródła C++ używające modułów maja mieć inne rozszerzenie, np .cppm

Po drugie nie opisałeś kompilatora. Żeby CMake mógł obslugiwać moduły potrzebne jest wspracie od kompilatora (coś więcej niż opisuje standard C++).
Potrzebny ci MSVC lub clang (gcc jeszcze nie ma tej funkcji) i to dość nowy.

Autor cmake o modułach C++

1 użytkowników online, w tym zalogowanych: 0, gości: 1