python - 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)
解决方案
如果 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 也足够智能以启动程序。
推荐阅读
- php - Laravel 切换数据库关于主数据库中的用户数据
- qt - QML ListView 在轻弹时卡住
- html - CSS 悬停一个 div,更改 2 个特定的嵌套 div
- xbmc - 如何通过 kodi api 设置信息标签?
- git - 使用 bitbucket 或类似工具管理共享点站点的版本
- angular - ngFor使用角度7迭代内部数组对象数组
- spring - Spring 无法实例化类:原因:java.lang.NoSuchMethodException
- php - 来自不同域的帖子后的 Chrome 会话/Cookie 问题(对于 samesite=strict)
- python - “from .. import”问题(ValueError:尝试相对导入超出顶级包)
- django - Nginx 和 gunicorn 工作正常,但无法连接站点。我怎么解决这个问题?