C++23中的import使用CMake实践

一、使用CMake进行模块编程

在前面开发中对使用import模块开发进行了简单的入门应用说明。但在实际的开发中,可能有更多的开发者使用CMake来开发C++程序,那么如何在cmake中使用模块进行开发呢?本文将对此通过一个基础的例程来进行分析说明。

此处的环境仍然是使用上文一样的环境,Ubuntu25.10,其它均为默认环境(gcc15.2 cmake3.31.6)

二、入门的程序

还是使用一个简单的例程:

c 复制代码
import std;
int main()
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}

下面可以使用两种方法:

  1. 使用g++和cmake
    其CMakelists.txt文件为:
    下面再把直接使用前文命令预编译好后的CMakeLists.txt文件描述一下:

    cmake_minimum_required(VERSION 3.16)

    project(importCMake LANGUAGES CXX)

    set(CMAKE_CXX_STANDARD 23)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmodules-ts")
    add_executable(importCMake main.cpp)

    include(GNUInstallDirs)
    install(TARGETS importCMake
    LIBRARY DESTINATION {CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION {CMAKE_INSTALL_BINDIR}
    )

但是需要提前在当前目录编译:

复制代码
g++ -std=c++23 -fmodules-ts -fsearch-include-path -c bits/std.cc

从而生成相关的std库依赖包。其它的编译处理方式与原来的编译没有区别。

直接使用类似下面Clang的直接编译的方式,将依赖库和应用一起编译完成,没有测试成功,总是报工具链不支持。

  1. 使用clang和cmake

其CMakeLists.txt的文件内容为:

复制代码
cmake_minimum_required(VERSION 3.31.6 FATAL_ERROR)
# 实验库CMake匹配GUID支持到 https://github.com/Kitware/CMake/blob/master/Help/dev/experimental.rst查看,必须严格匹配
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
# 设置Clang编译器
set(CMAKE_CXX_COMPILER "clang++")
set(CMAKE_C_COMPILER "clang")
# 使用Clang的libc++
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
set(CMAKE_CXX_EXTENSIONS OFF) # 避免编译命令设置 -std=gnu23
# C++23
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_MODULE_STD 1) # 自动编译 std 模块
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 生成 compile_commands.json 文件
project(importCMake2 LANGUAGES CXX)
add_executable(importCMake2)
target_sources(importCMake2
  main.cpp
)

在上面的CMake文件中,编译器使用提Clang。尝试了一上午使用g++没有搞定。查询各种资料和相关配置说明,都无法直接使用cmakelists.txt文件一步生成相关的文件。如果象前文一样预编译好gcm文件,倒是也可以使用CMake,但这样失去了便捷性。

三、编译和处理

这里重点分析一下Clang+CMake的编译。在上面的相关文件编写完成后,可以用下面的方法进行编译:

复制代码
#进入工程目录
mkdir build
cd build
cmake -G Ninja ..
ninja

此时会报下面的错误:

复制代码
CMake Error at /usr/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:73 (message):
  The C++ compiler

    "/usr/bin/clang++"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: '/home/fpc/importCMake2/build/CMakeFiles/CMakeScratch/TryCompile-I54ppq'

    Run Build Command(s): /usr/bin/ninja -v cmTC_cd1cc
    [1/2] /usr/bin/clang++   -stdlib=libc++  -std=c++23 -MD -MT CMakeFiles/cmTC_cd1cc.dir/testCXXCompiler.cxx.o -MF CMakeFiles/cmTC_cd1cc.dir/testCXXCompiler.cxx.o.d -o CMakeFiles/cmTC_cd1cc.dir/testCXXCompiler.cxx.o -c /home/fpc/importCMake2/build/CMakeFiles/CMakeScratch/TryCompile-I54ppq/testCXXCompiler.cxx
    [2/2] : && /usr/bin/clang++ -stdlib=libc++ -stdlib=libc++ CMakeFiles/cmTC_cd1cc.dir/testCXXCompiler.cxx.o -o cmTC_cd1cc   && :
    FAILED: cmTC_cd1cc
    : && /usr/bin/clang++ -stdlib=libc++ -stdlib=libc++ CMakeFiles/cmTC_cd1cc.dir/testCXXCompiler.cxx.o -o cmTC_cd1cc   && :
    /usr/bin/ld: 找不到 -lc++: 没有那个文件或目录
    clang++: error: linker command failed with exit code 1 (use -v to see invocation)
    ninja: build stopped: subcommand failed.

  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:24 (project)

从错误提示可看到需要安装相关的Clang自己的libc++的库,使用下面的命令:

复制代码
sudo apt install libc++-dev

重新编译即可成功。在build/CMakeFiles/__cmake_cxx23.dir目录下,可以看到std.pcm,这和前文中的std.o的功能一致。

四、总结

目前看来,g++和cmake一起相关的匹配细节还是有一些问题。至少是不太方便使用。大家可以使用Clang来写成同样的工作。当然,如果习惯使用g++,也可以使用前文的方式先用命令搞定std库的编译,再使用cmake,也没有问题。

不过大家不用担心,随着最终的版本落地,这种不方便适配的情况会很快改善。

相关推荐
C+-C资深大佬5 分钟前
C++数据类型
开发语言·c++·算法
初次见面我叫泰隆1 小时前
Qt——1、初识Qt
开发语言·c++·qt
兵哥工控2 小时前
MFC 对话框Alt+F4退出程序实例
c++·mfc
王老师青少年编程2 小时前
2024年9月GESP真题及题解(C++七级): 小杨寻宝
c++·题解·真题·gesp·csp·七级·小杨寻宝
凯子坚持 c2 小时前
C++大模型SDK开发实录(一):spdlog日志封装、通用数据结构定义与策略模式应用
数据结构·c++·sdk·策略模式
小屁猪qAq2 小时前
设计模式总纲
开发语言·c++·设计模式
Howrun7773 小时前
C++标准线程库-全面讲解
开发语言·c++
tod1133 小时前
从零手写一个面试级 C++ vector:内存模型、拷贝语义与扩容策略全解析
c++·面试·职场和发展·stl·vector
OopspoO3 小时前
C++杂记——构造函数
c++
淦。。。。3 小时前
题解:P14013 [POCamp 2023] 送钱 / The Generous Traveler
开发语言·c++·经验分享·学习·其他·娱乐·新浪微博