原因我经常被问到各种OpenCV开发环境文件,从OpenCV3到OpenCV4,从OpenCV源代码编译到
扩展模块编译vs2015编译c 源码,从SIFT支持到CUDA支持,从OpenCV C++版本到OpenCV-Python版本。我被问了很多,我懒得回答,不是我的心态,而是我想到了一个更好的方法,可以节省一些时间vs2015编译c 源码,同时还有非常详细的学习如何构建OpenCV开发环境,如何编译OpenCV各种版本的支持,所以我录制了一系列OpenCV开发环境构建视频教程, 并且全部上传到B站,需要直接查看。如果有问题,可以在下面留言,方便后期的人更好的观看,希望做一个CGC,持续更新的视频内容!
视频内容
目前,我已经发布了八部OpenCV环境构建视频,包括OpenCV C++/OpenCV-Python/tensorflow安装、OpenCV源代码编译与支持。它们如下:
1. OpenCV-Python开发环境搭建
https://www.bilibili.com/video/av30953498
2. OpenCV3 源码编译与SIFT支持代码演示
https://www.bilibili.com/video/av31462516
3. OpenCV4 +VS2015 开发环境搭建
https://www.bilibili.com/video/av36486959
4. OpenCV4-Python开发环境搭建
https://www.bilibili.com/video/av41974149
5. widnows10 下 tensorflow1.x的安装
https://www.bilibili.com/video/av48003741
6. widnows 10 下tensorflow2.0 + CUDA安装
https://www.bilibili.com/video/av70734671
7. OpenCV4 + CUDA 支持编译与配置
https://www.bilibili.com/video/av71643385
8. OpenCV4 DNN加速支持 + IE源码编译与配置
https://www.bilibili.com/video/av71979782
另外,我通常会在我的 github 上写一些与 OpenCV 相关的示例代码,你需要看看:
https://github.com/gloomyfish1998/opencv_tutorial
常见问题
编译 SIFT 支持
OpenCV 3.4.1 及更高版本,你必须在 cmake 选择 non-free 来添加 SIFT 模块支持,而 OpenCV-Python 扩展模块早就去掉了 SIFT 支持,只剩下低版本,还是自己编译吧!
OpenVINO支持编译
OpenVINO 需要先安装 OpenVINO,然后才能编译支持!
不同版本问题
虽然 OpenCV3 和 OpenCV4 版本有很大不同,但必须注意的是,相同的代码可能很难在不同的版本上编译和执行!
CMake 问题:
CMake 由于各种 donwload 问题而失败,主要是因为很难下载一些第三方库,例如 ffmpeg、IPPICV 等,没办法,只是想办法让它可下载!如果CMake失败,将导致许多模块在后续的VS构建中失败!
原始OpenCV文章摘要
概述
我通常在Linux系统上开发PHP扩展,扩展是通过编译和安装方法添加的
因为当我开发 php-opencv 扩展时,一些扩展用户问我是否可以提供窗口扩展 dll 引用文件。
因此,我最近考虑支持 Window 平台,总结了在 Window 下开发 PHP 扩展和编译成 DLL 的经验。
官方文档
尽管PHP是正式可用的,但有一个官方文档提供了将DLL编译到Windows中的扩展。
当时我没有仔细阅读官方文件,徒劳地摆弄了几天。
1. 环保意图
这里详细介绍了环境,在官方文档中对环境的要求,Visual Studio环境可以直接用Visual Studioide安装。我
仍然认为我指的是Visual C++,所以运行phpsdk-vc15-x64会在Canotdeternine'vc15'目录下出错可以使用
此 IDE 安装 PHP 编译为 DLL 的环境
1.1 安装 Visual Studio (IDE)。
去官网下载Visual Studio Install
1.2 添加编译环境
在 Visual Studio Professional 2017 下选择“更改”后,选择“在相应环境中安装”
已经计划了这样一个必要的环境
2. 编译前设置创建目录 2.1ph-sdk-二进制工具
php-sdk-binary-tools是一个官方工具
1.下载 php-sdk-二进制工具
git clone https://github.com/Microsoft/php-sdk-binary-tools
cd php-sdk-binary-tools
2.
调用启动脚本,比如我在这里是php7.2,对应VisualStudio 201764位版本,调用phpsdk-vc15-x64.bat
运行它并注意 cmd 窗口的开头将使用 $ 符号。
3. 运行phpsdk_buildtree批处理脚本,该脚本将创建所需的目录结构:
phpsdk_buildtree phpdev
你会发现运行后,php-sdk-binary-tools 中多了一个 phpdev 目录
phpsdk_buildtree脚本将根据当前使用的 VC++ 版本创建路径,并切换到新创建的目录
4. 将 PHP 源代码解压缩到:F:wwwphp-sdk-binary-toolsphpdevvc##x##,
在提取 PHP 源代码的同一目录中,有一个 deps 目录。
5. 步入解压的PHP源目录,运行phpsdk_deps-u或phpsdk_deps--update--branchmaster,PHP会手动下载所需的依赖(PHP7用于自动下载php-DSP文件)。
3. 编译 PHP 3.1 以建立配置的环境
编译前调用 php-sdk-binary-tools 中的入门脚本,手动设置 phpsdk-vc15-x64 要.bat构建的环境 phpsdk-vc15-x64
3.2 执行构建会议
切换到 PHP 源根目录并执行 buildconf 命令。
如果提示输入错误:没有用于文件扩充“.js”的脚本引擎。
这
造成这种情况的主要原因是系统安装了IDE(Dreamwear,UltraEdit编译前修改js源码内容,EditPlus,我之前安装phpstorm时更改了它)并更改了.js文件的默认打开方法。
仅当您要直接执行 js 脚本时,才会出现此错误。
快捷键win+r,然后输入注册表编辑器,打开注册表编辑器,找到[HKEY_CLASSES_ROOT.js],双击默认值将其更改为“JSFile”。如图所示:
之后,可以成功执行
3.3 编译配置
运行以下命令编译 PHP 配置:
configure --disable-all --enable-cli
注意:您可以适当调整,可以使用配置--help查看参数,例如
configure --disable-all --enable-cli --enable-debug --with-all-shared
成功执行后,系统将提示您执行 nmake
执行此步骤将在主目录中生成 config.w32.h 文件,这是编译 PHP 扩展所必需的
所以如果它是一个编译的PHP扩展,
下一个 nmake 被执行,如果它只是一个 PHP 编译扩展,则无法执行 'nmake'
3.4 执行 nmake 编译
之后,执行 nmake 开始编译
等待几分钟后,应该足以在 php-src 目录中找到一个带有额外编译位(x32 或 x64)的目录,并且目录中有 Release_TS(或 Release_NTS 或 Debug_TS)目录
如果编译正常编译前修改js源码内容,下面会有一个PHP.exe文件,证明PHP文件的编译成功
运行编译好的 php.exe-v 以查看它是否正常运行
4. 编译 PHP 扩展
4.1 创建 PHP 扩展
如果我们只是编译一些已经打开的扩展源代码,我们可以在这里创建一个演示扩展进行编译,而无需运行此步骤。
使用 gitbash 单步进入源代码的 addressext 目录并执行:
php.exe ext_skel_win32.php --extension=my_function
注意:为什么要使用 gitbash
这里的工具是因为 Gitbash 自带模拟 Linux 环境,my_function是我需要在这里创建的扩展,你可以根据自己修改
创建执行工具时没有提示“sh'isnotrecognizedasaninternalorexternalcommand,
gitbash 执行结果:
可以看到在源代码的 ext 目录下还有一个额外的my_function目录,这是我们刚刚使用 ext_skel_win32.php 命令创建的初始扩展代码
4.2 更改源代码
1.我们在my_function下编辑my_function.c文件。
添加一种方式my_function_test方式,代码如下:
PHP_FUNCTION(my_function_test) {
php_printf("This is my function PHP extension! n");
}
2. 之后,将PHP_FE(my_function_test,NULL)添加到 constzend_function_entrymy_function_functions[],但在PHP_FE_END之前:
4.3 编译与扩展
切换回窗口的 cmd
1. 进入 php-sdk-binary-tools 目录并使用 phpsdk-vc15-x64 .bat
2. 切换到 PHP 源目录并运行 BuildConf
3. 如果在执行构建会议后执行配置命令,将提示类似于以下内容的错误:
打开提示文件,找到对应的行数,发现末尾还有多余的注释符号。这可能是工具的问题
解决方案:打开扩展源代码的 config.w32,找到 //否则,useARG_ENABLE此注释中删除,然后重新运行 buildconf。
注意:
运行 configure--help 会注意到还有更多 --enable-my_function 选项:
4. 运行配置--禁用所有--启用-cli--启用-my_function=共享以编译配置:
检测到错误消息:
F:wwwphp-sdk-binary-toolsphpdevvc15x64php-7.2.12-srcconfigure.js(5490, 2) Microsoft JScript 运行时错误: 'PHP_EXTNAME_SHARED' 未定义
解决方案:重新打开扩展的 config.w32 文件并删除右侧的映像,PHP_EXTNAME_SHARED“/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1”
重启 buildconf->运行编译配置命令,可以看到编译配置成功提示启用扩展: 不仅仅是我们的扩展:
5.运行nmake命令进行编译,等待几分钟到十几分钟后,如果终端出现类似下面的编译成功,则表示编译成功
但是,我发现源目录下还有一个额外的x64目录,如果编译的东西32位是x86,
上面有一个Release_TS(发布代表非调试,对应于调试,TS是线性安全的,对应于NTS)。
上面的文件是我们编译的PHP文件
,但我们发现php_my_function.dll文件就是我们编译的扩展文件。
6. 为 PHP .ini引用编译配置扩展
单步进入编译目录,运行 php.exe-v 测试编译是否正常
运行 php.exe--
ini 命令,你会发现没有配置文件,但是运行 php.exe-m 会发现没有我们在 PHPModules 中创建的my_function扩展
复制 php
.ini开发在源码到编译目录下,改名改为 php.ini,再更改 php .ini文件
源语言:
; On windows:
; extension_dir = "ext"
将其替换为:
; On windows:
extension_dir = "./"
但:
再次运行 php-m 测试
7. 测试
添加测试文件测试.php
<?php
my_function_test();
之后,运行生成的 PHP 目录php.exetest.php
至此,编译 PHP 和在窗口下编译 PHP 扩展已经成功。
本作品迭代参考采用“CC合同”,转载须注明作者及本文链接