我已经阅读了以下教程Write c++ extensions并编写了一个简单的函数,但是我使用的是64位linux(并且我不知道如何为python创建32位的监狱),所以我启动了python3 .6 64位并导入了模块,一切正常。
实际上,我已经将pybind11编译为64位,并且对于插件而言,相同, 但是所有内容仍然可以使用64位。
但是根据教程
使用C ++要求您使用32位Python解释器(建议使用Python 3.6或更高版本)。
那么,如果我可以将扩展名构建和导入为64位,为什么还要使用32位解释器?
在将应用程序构建为可执行文件并包括模块时,这还会引起任何问题吗?
c ++扩展名(Linux下显示的Windows版本是相同的,但使用process_vm_writev而不是WriteProccessMemory):
#include <pybind11/pybind11.h>
#include <iostream>
#include <string>
#include <Windows.h>
int main(char* procID, int address, int newValue) {
DWORD pID = atoi(procID);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
if (handle == NULL) {
return 1;
} else {
LPVOID mem_addr = (LPVOID)address;
std::cout << "address: " << address << "\n";
std::cout << "mem_addr: " << mem_addr << "\n";
WriteProcessMemory(handle, mem_addr, &newValue, sizeof(newValue), 0);
}
return 0;
}
namespace py = pybind11;
PYBIND11_MODULE(c_writter, m) {
m.doc() = "pybind11 memory writter plugin"; // optional module docstring
m.def("writter", &main, "A function that writes to process memory");
}
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.12)
project(cnake)
find_package(pybind11 REQUIRED)
if( $ENV{BUILD_TARGET} STREQUAL "linux")
pybind11_add_module(c_writter lin_source.cpp)
elseif( $ENV{BUILD_TARGET} STREQUAL "windows" )
pybind11_add_module(c_writter win_source.cpp)
endif()
在Windows上这会生成一个.pyd模块,在Linux上会生成一个.so,并且如果我将该模块导入到Linux上的64位python时,它还可以按预期运行,则我尚未在Windows上对其进行过测试。