我有一个最小的样本:
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++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} 的。