如何在cmake中将fmt与c++20模块和c++23标准库模块一起使用?

问题描述 投票:0回答:1

我有一个最小的样本:

import fmt;
import std;
int main(int argc, char* argv[])
{
    auto v = std::vector<int>{1, 2, 3};
    fmt::print("{}", fmt::join(v, ", "));
    return 0;
}
cmake_minimum_required(VERSION 3.30 FATAL_ERROR)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
set(CMAKE_CXX_MODULE_STD 1)

project(main LANGUAGES CXX)

add_executable(main main.cpp)

include(FetchContent)
FetchContent_Declare(
        fmt
        GIT_REPOSITORY https://github.com/fmtlib/fmt
        GIT_TAG        0c9fce2ffefecfdce794e1859584e25877b7b592) # 11.0.2
FetchContent_MakeAvailable(fmt)
#target_link_libraries(main fmt::fmt)
target_sources(main
        PUBLIC FILE_SET CXX_MODULES
        FILES
        ${fmt_SOURCE_DIR}/src/fmt.cc
)
target_include_directories(main PRIVATE ${fmt_SOURCE_DIR}/include)

但是它不起作用并且显示

join is not found
(未超载)所以我向某人寻求帮助是否有在cmake中将fmt与c ++ 20模块一起使用的更有用的示例。

我也注意到了这个

import fmt;

int main() {
  fmt::print("Hello, modules!\n");
}
cmake_minimum_required(VERSION 3.11)
project(HELLO CXX)

set(CMAKE_CXX_EXTENSIONS OFF)
add_subdirectory(fmt)
add_executable(hello hello.cc)
target_link_libraries(hello fmt)

它仅适用于 clang 和 make。 Ninja 使用 gcc 或 msvc,甚至 clang 也会出现各种错误...(三个完全不同)

我无法通过谷歌找到在 c++20 或 c++23 标准中使用 fmt 的其他示例。 C++ 20 或 C++ 23 示例对我和其他对此感兴趣的人都有好处。

c++ cmake fmt c++-modules
1个回答
0
投票

C++20模块的简单使用中描述的方法是{fmt}当前支持的方法。

hello.cc

import fmt;

int main() {
  fmt::print("Hello, modules!\n");
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.11)
project(HELLO CXX)

set(CMAKE_CXX_EXTENSIONS OFF)
add_subdirectory(fmt)
add_executable(hello hello.cc)
target_link_libraries(hello fmt)

用 clang 构建:

CXX=clang++ cmake -DFMT_MODULE=ON .
make

不幸的是,目前已知只有 clang 可以完全工作。自 14.2 版本起,GCC 的模块实现不完整,导致内部编译器错误。 MSVC 也存在各种问题,尽管有报道称它是通过各种解决方法来编译 {fmt} 的。

© www.soinside.com 2019 - 2024. All rights reserved.