cmake构建python调用C++
了解到python写界面很方便也美观,想搞个小场景,实现用python写界面调用C++程序的流程。
小场景:计算加法
1、Python 程序show.py :创建了一个 GUI 界面,让用户输入两个数字,点击"相加"按钮时,调用C++程序
2、C++ 程序addsum.cpp :接收参数,将两个参数转换为整数并相加,输出结果
3、CMakeLists.txt :构建 C++ 程序sum_res
show.py
import tkinter as tk from tkinter import filedialog, ttk import subprocess class ShowAddApp: def __init__(self, root): self.root = root self.root.title("求加法") self.root.geometry("550x200") ttk.Label(text="num a").pack(side=tk.LEFT, padx=5) self.add_enter_a = tk.StringVar() add_a = ttk.Entry(textvariable=self.add_enter_a,width=5) add_a.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True) ttk.Label(text="num b").pack(side=tk.LEFT, padx=5) self.add_enter_b = tk.StringVar() add_b = ttk.Entry(textvariable=self.add_enter_b,width=5) add_b.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True) self.browse_btn = ttk.Button(text="相加", command=self.get_add_res) self.browse_btn.pack(side=tk.LEFT, padx=5) ttk.Label(text="相加结果").pack(side=tk.LEFT, padx=5) def get_add_res(self): numA = self.add_enter_a.get() numB = self.add_enter_b.get() if not numA or not numB: tk.messagebox.showwarning("警告", "请输入A和B") return try: result = subprocess.run( ["./sum_res", numA, numB], capture_output=True, text=True, check=True ) res_num = result.stdout ttk.Label(text=res_num).pack(side=tk.LEFT, padx=5) except subprocess.CalledProcessError as e: tk.messagebox.showerror("错误1",f"C++程序执行失败: {e.stderr}") except Exception as e: tk.messagebox.showerror("错误2",f"发生未知错误:{str(e)}") if __name__ == "__main__": root = tk.Tk() app = ShowAddApp(root) root.mainloop()
addsum.cpp
#include <iostream> using namespace std; int main(int argc, char* argv[]){ if(argc!= 3){ cerr<<"Usage argc: "<< argc <<endl;return 1; } int c = stoi(argv[1]) + stoi(argv[2]); std::string numStr = std::to_string(c); cout << numStr << endl; return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(AddSum) set(CMAKE_CXX_STANDARD 11) add_executable(sum_res addsum.cpp)
构建程序执行的命令
cmake -S . -B build
cd build && make
复制生成文件sum_res到源文件目录
python3 show.py

浙公网安备 33010602011771号