首页 > 解决方案 > Python:如何编写脚本以通过 CMake 编译和运行 C++ 程序?

问题描述

假设我有以下项目结构,

|   CMakeLists.txt
|   run_experiments.py
+---libs
\---src
        main.cpp
        main.h

如何run_experiments.py通过 CMake 编译程序并使用不同的命令行参数多次运行它?我试过的:

# run_experiments.py

import os

os.system("mkdir bin build")
os.chdir("build")
os.system('cmake -G"Unix Makefiles" ..')
os.system("make")
# and so on...

但它看起来已经很丑了,我正在寻找最优雅和跨平台的解决方案(例如,带有 MinGW 和 Linux 的 Windows)。

UPD:添加了 my CMakeLists.txt,这是 CLion 默认生成的:

cmake_minimum_required(VERSION 3.16)
project(test_tokenizing)

set(CMAKE_CXX_STANDARD 14)

add_executable(test_tokenizing src/main.cpp src/main.h)

标签: pythonc++cmake

解决方案


如果 C++ 代码不是动态生成的,我建议你在启动 python 程序之前先构建它,然后从 python 程序中执行它。

如果您有充分的理由从 python 代码构建它,我在https://github.com/kyotov/experiments为您创建了一个小示例。这样的东西适用于 run_exeriements.py:

import os
import subprocess


def main():
    os.makedirs('build', exist_ok=True)
    subprocess.check_call('cmake -B build -G "NMake Makefiles"', shell=True)
    subprocess.check_call('cmake --build .', shell=True, cwd='build')

    subprocess.check_call('experiments 1 2 3', shell=True, cwd='build')
    subprocess.check_call('experiments 2 3 4', shell=True, cwd='build')


if __name__ == '__main__':
    main()

我将以下内容用于main.cpp

#include <iostream>

int main(int argc, char **argv) {
    for (auto i = 0; i < argc; i++)
        std::cout << argv[i] << std::endl;
    return 0;
}

当我运行时,python run_experiements.py我得到这个输出:

(base) C:\kamen\clion\experiments>python run_experiments.py
-- Configuring done
-- Generating done
-- Build files have been written to: C:/kamen/clion/experiments/build
[100%] Built target experiments
experiments
1
2
3
experiments
2
3
4

要使其正常工作,您需要正确设置环境以找到所需的工具。就我而言,我将 Miniconda3 用于 python,然后"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat"在路径中获取我的编译器和 cmake。

我手边没有一台 Linux 机器,但如果你设置-G条件并使用Unix Makefiles它,它很可能也可以在 Linux(和其他地方)上运行。请注意,您不必费心.exe在 Windows 上,因为即使您没有指定 shell,shell 也足够智能以启动程序。


推荐阅读