PYTHON C++混合編程筆記(一)- VS2017 編譯 python 2.7python
0x00 前言編程
最近想把一些經驗和筆記分享出來,也便於本身查詢和複習。windows
0x01 環境準備app
1) 下載python 最新2.7.16源代碼 測試
https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tar.xzui
2) VS2017spa
0x02 外部庫下載命令行
1)命令行進入到解壓目錄的PCbuild,如X:\Python-2.7.16\PCbuilddebug
2)運行get_externals.bat,下載外部庫,如圖所示code
0x03 編譯
1)打開PCbuild目錄的pcbuild.sln,根據須要選擇後點「肯定」,如圖所示:
2)先選擇python、pythoncore的win32 debug 版本測試編譯,如圖所示:
3)編譯失敗,須要修改相關標識符
4)timezone改成_timezone , daylight改成daylight , tzname改成tzname後,從新編譯
1 #ifdef PYOS_OS2 2 PyModule_AddIntConstant(m, "timezone", _timezone); 3 #else /* !PYOS_OS2 */ 4 PyModule_AddIntConstant(m, "timezone", _timezone); 5 #endif /* PYOS_OS2 */ 6 #ifdef HAVE_ALTZONE 7 PyModule_AddIntConstant(m, "altzone", altzone); 8 #else 9 #ifdef PYOS_OS2 10 PyModule_AddIntConstant(m, "altzone", _timezone-3600); 11 #else /* !PYOS_OS2 */ 12 PyModule_AddIntConstant(m, "altzone", _timezone -3600); 13 #endif /* PYOS_OS2 */ 14 #endif 15 PyModule_AddIntConstant(m, "daylight", _daylight); 16 PyModule_AddObject(m, "tzname", 17 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
5)編譯仍然失敗,以下圖所示:
6)找到pythoncore 工程的posixmodule.c , 修改_PyVerify_fd以下
/* This function emulates what the windows CRT does to validate file handles */ int _PyVerify_fd(int fd) { // const int i1 = fd >> IOINFO_L2E; // const int i2 = fd & ((1 << IOINFO_L2E) - 1); // static int sizeof_ioinfo = 0; // /* Determine the actual size of the ioinfo structure, // * as used by the CRT loaded in memory // */ // if (sizeof_ioinfo == 0 && __pioinfo[0] != NULL) { // sizeof_ioinfo = _msize(__pioinfo[0]) / IOINFO_ARRAY_ELTS; // } // if (sizeof_ioinfo == 0) { // /* This should not happen... */ // goto fail; // } // /* See that it isn't a special CLEAR fileno */ // if (fd != _NO_CONSOLE_FILENO) { // /* Microsoft CRT would check that 0<=fd<_nhandle but we can't do that. Instead // * we check pointer validity and other info // */ // if (0 <= i1 && i1 < IOINFO_ARRAYS && __pioinfo[i1] != NULL) { // /* finally, check that the file is open */ // my_ioinfo* info = (my_ioinfo*)(__pioinfo[i1] + i2 * sizeof_ioinfo); // if (info->osfile & FOPEN) { // return 1; // } // } // } //fail: // errno = EBADF; //a call to _get_osfhandle with invalid fd sets errno to EBADF if (_get_osfhandle(fd) == INVALID_HANDLE_VALUE) return 0; else return 1; return 0; }
7)再次編譯,編譯成功。
8)根據須要選擇相應庫進行編譯
0x04 後記
C++ 調用python的工程中, 若是是debug必須使用debug版本的python,若是是release必須使用release版本編譯的python,包括全部庫的lib,debug必須使用***_d.lib。