Closed vkviyu closed 4 months ago
第一个问题: libtool: unrecognized option
-export-dynamic' 执行
make clean重新构建 ,全称应该是
--export-dynamic`
第二个问题: https://github.com/swoole/swoole-cli/actions/runs/8262323228/job/22601412406#step:10:1606 只是警告
可以先下载已经构建好的版本试试
https://github.com/swoole/swoole-cli/releases/tag/v5.1.1.0
https://github.com/swoole/swoole-cli/releases/tag/v5.1.1.0
https://github.com/swoole/swoole-cli/actions/runs/8262323228/job/22601412406#step:10:1606
oci8 或者 pdo_oci 待验证
@jingjingxyk
第一个问题:
libtool: unrecognized option
-export-dynamic'执行
make clean重新构建 ,全称应该是
--export-dynamic`第二个问题: https://github.com/swoole/swoole-cli/actions/runs/8262323228/job/22601412406#step:10:1606 只是警告
可以先下载已经构建好的版本试试
https://github.com/swoole/swoole-cli/releases/tag/v5.1.1.0
https://github.com/swoole/swoole-cli/releases/tag/v5.1.1.0
https://github.com/swoole/swoole-cli/actions/runs/8262323228/job/22601412406#step:10:1606
第一个问题。我 make clean 之后重新构建,还是会发生同样的报错。 还有就是,构建 build-naive-php 这个版本,在 cygwin-build.sh 阶段,在弹出这个警告之后: 构建过程好像就终止了(还是正常结束了)? 但是这 build 出来的程序目录是这样的: 这是没有构建完全吗还是说没有进行构建?。如果我 php.exe -m 就会报错弹窗: 翻了很多文档,好像对于 windows 上 swoole-cli 的构建很少。
第一个问题,我再试试。
第二个问题: 执行打包看看,然后在测试看看
我购买了弹性云服务器,再一次验证测试 问题一,结果如下:
问题二: 构建结果如下
@jingjingxyk
第一个问题:
libtool: unrecognized option
-export-dynamic'执行
make clean重新构建 ,全称应该是
--export-dynamic` 第二个问题: https://github.com/swoole/swoole-cli/actions/runs/8262323228/job/22601412406#step:10:1606 只是警告 可以先下载已经构建好的版本试试 https://github.com/swoole/swoole-cli/releases/tag/v5.1.1.0 https://github.com/swoole/swoole-cli/releases/tag/v5.1.1.0 https://github.com/swoole/swoole-cli/actions/runs/8262323228/job/22601412406#step:10:1606第一个问题。我 make clean 之后重新构建,还是会发生同样的报错。 还有就是,构建 build-naive-php 这个版本,在 cygwin-build.sh 阶段,在弹出这个警告之后: 构建过程好像就终止了(还是正常结束了)? 但是这 build 出来的程序目录是这样的: 这是没有构建完全吗还是说没有进行构建?。如果我 php.exe -m 就会报错弹窗: 翻了很多文档,好像对于 windows 上 swoole-cli 的构建很少。
构建结果是正常的,构建出来的是命令行程序,不应该用双击打开程序。
@jingjingxyk 感谢你的帮助。我这边直接编译已经能够成功了,之前的问题应该是库版本或者库缺失的问题,通过 quickstart 下面的快速安装脚本,已经解决这个问题了。我现在在尝试想要用 OCI8 或者 pdo_oci 。
@jingjingxyk 请问现在 swoole-cli 的编译还不支持 oci8 和 pdo_oci 吗?还是说仅是 Cygwin 的 swoole-cli 的编译不支持 oci8 和 pdo_oci 。我在 cygwin-config.sh 这个脚本中指定配置参数 --with-oci8 和 --with-pdo-oci 。如下图: 然后在 cygwin-build.sh 阶段,最后会输出:Extension 'swoole' not present 。应该是和这两个参数有关系吧? 同时在这个 php -m 的输出里,显然有很多模块还没有被构建进来,应该是构建提前结束了?使用打包的这个 sh 脚本,也不会产生文件夹。
@jingjingxyk 请问现在 swoole-cli 的编译还不支持 oci8 和 pdo_oci 吗?还是说仅是 Cygwin 的 swoole-cli 的编译不支持 oci8 和 pdo_oci 。我在 cygwin-config.sh 这个脚本中指定配置参数 --with-oci8 和 --with-pdo-oci 。如下图: 然后在 cygwin-build.sh 阶段,最后会输出:Extension 'swoole' not present 。应该是和这两个参数有关系吧? 同时在这个 php -m 的输出里,显然有很多模块还没有被构建进来,应该是构建提前结束了?使用打包的这个 sh 脚本,也不会产生文件夹。
ext
目录,即可进行编译验证。建议用experiment
分支来验证Extension 'swoole' not present
出现这个是因为,swoole 源码不存在,需要拉取一下。 (拉取子模块git submodule update --init
)bash ./sapi/scripts/cygwin/cygwin-config.sh
注意看预处理提示@jingjingxyk 我发现为什么之构建了一部分 PHP 扩展了,原来是因为 cygwin-config.sh 这个文件 configure 中的参数项行与行之间不能有空行,也就是回车,回车被当作了结束,所以只 configure 了一部分参数项,正好启用 swoole 扩展的参数项就是在空行后面,导致没有被 configure 进去。也就导致输出了 swoole 扩展不存在这个问题。 这些配置项行与行之间不能有空行,这么简单的问题我刚注意到。十分感谢你的帮助。
@jingjingxyk pdo-oci 好像找不到 sdk 下 include 目录的路径,oci8 在 configure 阶段 check for pcntl 会检测失败
instantclient 目录,如下图所示,包含了 basc 目录和 sdk 目录:
--with-pdo-oci
参数,直接书写 Oracle Instant Client 目录路径:--with-pdo-oci=/cygdrive/f/instantclient
,如下图所示:
在 configure 阶段会报错输出以下内容:
checking Oracle OCI support for PDO... yes
checking Oracle Install-Dir... /cygdrive/f/instantclient :/cygdrive/f/instantclient:
checking if that is sane... yes
checking Oracle version... configure: error: Oracle-OCI needed libraries not found under /cygdrive/f/instantclient
如下图所示:
--with-pdo-oci
参数,在 Oracle Instant Client 目录路径前面加上 instantclient,
即:
--with-pdo-oci=instantclient,/cygdrive/f/instantclient
,如下图所示:
![image-20240315200542354](Cygwin 构建 swoole-cli 的 pdo-oci md.assets/image-20240315200542354.png)
在 configure 阶段会报错输出以下内容:
checking Oracle OCI support for PDO... yes
checking Oracle Install-Dir... instantclient,/cygdrive/f/instantclient :instantclient,/cygdrive/f/instantclient:
checking if that is sane... yes
checking for oci.h... configure: error: I'm too dumb to figure out where the include dir is in your instant client install
如下图所示:
我不知道哪种写法是正确的,第一种:--with-pdo-oci=/cygdrive/f/instantclient
,还是第二种:--with-pdo-oci=instantclient,/cygdrive/f/instantclient
。这两种写法我都设置了 ORACLE_HOME
环境变量为 instantclient
目录的路径,但好像都没有作用。我感觉第二种写法是正确的,但是不知道为什么会找不到 include 目录。
如果使用 oci8 扩展,在 configure 阶段的 check for foek
时,就会显示 no
:configure: error: pcntl: fork() not supported by this platform
。使用 pdo-oci 扩展的话这个检测可以过去,就是后面那样找不到 include dir。
@jingjingxyk pdo-oci 好像找不到 sdk 下 include 目录的路径,oci8 在 configure 阶段 check for pcntl 会检测失败
instantclient 目录,如下图所示,包含了 basc 目录和 sdk 目录:
--with-pdo-oci
参数,直接书写 Oracle Instant Client 目录路径:--with-pdo-oci=/cygdrive/f/instantclient
,如下图所示:在 configure 阶段会报错输出以下内容:
checking Oracle OCI support for PDO... yes checking Oracle Install-Dir... /cygdrive/f/instantclient :/cygdrive/f/instantclient: checking if that is sane... yes checking Oracle version... configure: error: Oracle-OCI needed libraries not found under /cygdrive/f/instantclient
如下图所示:
--with-pdo-oci
参数,在 Oracle Instant Client 目录路径前面加上instantclient,
即:
--with-pdo-oci=instantclient,/cygdrive/f/instantclient
,如下图所示:![image-20240315200542354](Cygwin 构建 swoole-cli 的 pdo-oci md.assets/image-20240315200542354.png)
在 configure 阶段会报错输出以下内容:
checking Oracle OCI support for PDO... yes checking Oracle Install-Dir... instantclient,/cygdrive/f/instantclient :instantclient,/cygdrive/f/instantclient: checking if that is sane... yes checking for oci.h... configure: error: I'm too dumb to figure out where the include dir is in your instant client install
如下图所示:
我不知道哪种写法是正确的,第一种:
--with-pdo-oci=/cygdrive/f/instantclient
,还是第二种:--with-pdo-oci=instantclient,/cygdrive/f/instantclient
。这两种写法我都设置了ORACLE_HOME
环境变量为instantclient
目录的路径,但好像都没有作用。我感觉第二种写法是正确的,但是不知道为什么会找不到 include 目录。如果使用 oci8 扩展,在 configure 阶段的
check for foek
时,就会显示no
:configure: error: pcntl: fork() not supported by this platform
。使用 pdo-oci 扩展的话这个检测可以过去,就是后面那样找不到 include dir。
写法是否正确,进入扩展目录看描述,看例子就能判断,是否正确 。参考: https://www.php.net/pdo_oci ;https://www.php.net/manual/en/oci8.installation.php
方法一: 应该找到 cygwin 环境下对应的 instantclient库 ,这里没有搜到https://cygwin.com/cgi-bin2/package-grep.cgi?grep=instantclient 方法二: cygwin 环境下编译 instantclient ,无源码https://www.oracle.com/cn/database/technologies/instant-client/downloads.html 方法三: 使用odbc , https://www.oracle.com/cn/database/technologies/releasenote-odbc-ic.html ; cygwin 环境中源码编译unixODBC库。 https://github.com/lurcher/unixODBC/blob/master/README.CYGWIN
使用那种,我也不确定,需要实验验证。
@jingjingxyk
之前所说的那个找不到 include dir
的报错已经解决了。原因是因为 pecl 上面提供的 pdo_oci
扩展很久没有更新了,相比于 php 源码中提供的 pdo_oci
扩展落后很多个版本,所以扩展中的导致 config.m4 文件和 Oracle Instant Client 目录结构没有对应上。
在新版的 php 当中,--with-pdo-oci=instantclient,/path/to/client
。这个配置项这样配置应该是没有问题的。
昨天看了一晚上 pdo_oci
扩展的 config.m4 文件,得出了上面的结论。
现在好像目录都能找到了但是又出现了新的问题,如下所示:
checking whether to enable PDO support... yes
checking for MySQL support for PDO... yes
checking for the location of libz... no
checking for MySQL UNIX socket location... no
checking for PDO includes... /cygdrive/f/last/swoole-cli/ext
checking Oracle OCI support for PDO... yes
checking Oracle Install-Dir... instantclient,/cygdrive/f/instantclient
checking if that is sane... yes
checking size of long... (cached) 8
checking if we're at 64-bit platform... yes
checking Oracle version... 21.1
checking for oci.h... /cygdrive/f/instantclient/sdk/include
checking for OCIEnvCreate in -lclntsh... no
checking for OCIEnvNlsCreate in -lclntsh... no
checking for OCIStmtFetch2 in -lclntsh... no
checking for OCILobRead2 in -lclntsh... no
checking for PDO includes... (cached) /cygdrive/f/last/swoole-cli/ext
checking for PostgreSQL support for PDO... no
checking for PostgreSQL support... no
checking for phar archive support... yes
checking for phar openssl support... yes
checking whether to enable POSIX-like functions... yes
checking for sys/mkdev.h... no
checking for sys/sysmacros.h... yes
checking for seteuid... no
checking for setegid... no
checking for setsid... no
checking for getsid... no
checking for getpgid... no
checking for ctermid... no
checking for mkfifo... no
checking for mknod... no
checking for setrlimit... no
checking for getrlimit... no
checking for getgroups... no
checking for makedev... no
checking for initgroups... no
checking for getgrgid_r... no
checking for working ttyname_r() implementation... no, posix_ttyname() will be thread-unsafe
checking for utsname.domainname... no
checking for libedit readline replacement... no
checking for readline support... yes
checking for tgetent in -lncurses... no
checking for tgetent in -ltermcap... no
checking for readline in -lreadline... no
configure: error: readline library not found
感觉这一段输出中的:
这四条信息应该是最后导致错误 readline library not found
产生的原因。
从这段信息来看是我不太确信是因为我环境变量配置的仍然有问题,导致它最终还是没有找到 lclntsh
从而导致报错?;还是说其实 Oracle Instant Client 这个客户端库在 cygwin 上就是不受支持的,哪怕 Cygwin 模拟了一个 linux 的环境同样没有办法直接使用适用于 linux 的 Oracle Instant Client 库?
还有就是之前所说的如果开启 oci8
扩展就会产生 opcache 不支持、pcntl 不支持这两个问题。想用 oci8
应该也是不太可能了。
@jingjingxyk 之前所说的那个找不到
include dir
的报错已经解决了。原因是因为 pecl 上面提供的pdo_oci
扩展很久没有更新了,相比于 php 源码中提供的pdo_oci
扩展落后很多个版本,所以扩展中的导致 config.m4 文件和 Oracle Instant Client 目录结构没有对应上。在新版的 php 当中,
--with-pdo-oci=instantclient,/path/to/client
。这个配置项这样配置应该是没有问题的。昨天看了一晚上
pdo_oci
扩展的 config.m4 文件,得出了上面的结论。现在好像目录都能找到了但是又出现了新的问题,如下所示:
checking whether to enable PDO support... yes checking for MySQL support for PDO... yes checking for the location of libz... no checking for MySQL UNIX socket location... no checking for PDO includes... /cygdrive/f/last/swoole-cli/ext checking Oracle OCI support for PDO... yes checking Oracle Install-Dir... instantclient,/cygdrive/f/instantclient checking if that is sane... yes checking size of long... (cached) 8 checking if we're at 64-bit platform... yes checking Oracle version... 21.1 checking for oci.h... /cygdrive/f/instantclient/sdk/include checking for OCIEnvCreate in -lclntsh... no checking for OCIEnvNlsCreate in -lclntsh... no checking for OCIStmtFetch2 in -lclntsh... no checking for OCILobRead2 in -lclntsh... no checking for PDO includes... (cached) /cygdrive/f/last/swoole-cli/ext checking for PostgreSQL support for PDO... no checking for PostgreSQL support... no checking for phar archive support... yes checking for phar openssl support... yes checking whether to enable POSIX-like functions... yes checking for sys/mkdev.h... no checking for sys/sysmacros.h... yes checking for seteuid... no checking for setegid... no checking for setsid... no checking for getsid... no checking for getpgid... no checking for ctermid... no checking for mkfifo... no checking for mknod... no checking for setrlimit... no checking for getrlimit... no checking for getgroups... no checking for makedev... no checking for initgroups... no checking for getgrgid_r... no checking for working ttyname_r() implementation... no, posix_ttyname() will be thread-unsafe checking for utsname.domainname... no checking for libedit readline replacement... no checking for readline support... yes checking for tgetent in -lncurses... no checking for tgetent in -ltermcap... no checking for readline in -lreadline... no configure: error: readline library not found
感觉这一段输出中的:
* checking for OCIEnvCreate in -lclntsh... no checking for OCIEnvNlsCreate in -lclntsh... no checking for OCIStmtFetch2 in -lclntsh... no checking for OCILobRead2 in -lclntsh... no
这四条信息应该是最后导致错误
readline library not found
产生的原因。从这段信息来看是我不太确信是因为我环境变量配置的仍然有问题,导致它最终还是没有找到
lclntsh
从而导致报错?;还是说其实 Oracle Instant Client 这个客户端库在 cygwin 上就是不受支持的,哪怕 Cygwin 模拟了一个 linux 的环境同样没有办法直接使用适用于 linux 的 Oracle Instant Client 库?还有就是之前所说的如果开启
oci8
扩展就会产生 opcache 不支持、pcntl 不支持这两个问题。想用oci8
应该也是不太可能了。
需要确认Oracle Instant Client 是否支持cygwin 环境,我在Oracle 官网上没有找到相关信息 https://www.google.com/search?q=Oracle+Instant+Client+for+cygwin+
@jingjingxyk 如果要创建 pdo_oci 扩展和 oci8 扩展,那么在 sapi/src/builder/extension 创建扩展之后,要在扩展里面指定依赖库之后,然后还需要 library 目录下创建下面这种格式来进行构建吗?
@jingjingxyk 如果要创建 pdo_oci 扩展和 oci8 扩展,那么在 sapi/src/builder/extension 创建扩展之后,要在扩展里面指定依赖库之后,然后还需要 library 目录下创建下面这种格式来进行构建吗?
linux 、macos 环境下是需要这样做的,cygwin 环境下不需要
@jingjingxyk 我一开始是想用 Cygwin 的。因为它很方便,但是恰巧没有我要用的 pdo_oci 和 oci8 扩展,然后就想办法解决,看了 Cygwin 的构建编译阶段的几个 sh 脚本,Cygwin 下应该是不走 builder 目录下的 extension 和 library ,直接走 ext 目录吧。但是后面就遇到了之前所说的问题。好像在 Cygwin 下只是在 config.sh 中指定 pdo_oci 扩展和 oci8 扩展的 Oracle Instant Client 目录,走不下去。没办法了只能转向 wsl 或者 linux 这种了。结果发现一样的过不了 Oracle Instant Client 这一关,不过好在还有点思路能尝试。还是说在 Cygwin 环境中也需要将 oracle instant client 集成进来,而不能单纯的只是在 config.sh 中的 --with-pdo-oci 这个参数中指定 oracle instant client 库的目录。
@vkviyu 真正的问题在于oracle instant client 没有开放源码,官方仅提供可动态加载的二进制库
构建步骤是按照文档所描述的以下五步所进行的: bash ./sapi/scripts/cygwin/install-re2c.sh bash ./sapi/scripts/cygwin/cygwin-config-ext.sh bash ./sapi/scripts/cygwin/cygwin-config.sh bash ./sapi/scripts/cygwin/cygwin-build.sh bash ./sapi/scripts/cygwin/cygwin-archive.sh
libtool: unrecognized option
-export-dynamic' Try
libtool --help' for more information. make: *** [Makefile:258: bin/swoole-cli] Error 1在 cygwin-build.sh 阶段,会报这个错误:libtool: unrecognized option `-export-dynamic'
同时如果在 config.sh 中启用了 opcache :--enable-opcache ,那么在 cygwin-config.sh 这个阶段也会报错找不到共享内存,不支持 sysvipc 之类的错误。
使用 build-native-cli 的版本进行构建,可以在最后构建出一个 php.exe ,但是在最后也会提示: sapi/cli/php_cli_server.o sapi/cli/ps_title.o sapi/cli/php_cli_process_title.o -lrt -lm -o sapi/cli/php /usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: warning: --export-dynamic is not supported for PE+ targets, did you mean --export-all-symbols?
然后点击构建出的 php.exe ,使用 php -m 就会提示:”无法定位程序输入点 setproctitle 于动态链接库 php.exe 上“。
因为我需要使用 oci8 或者说 pdo_oci ,还不得不直接在 windows 环境上直接使用。所以只能自己构建。 我想问一下官方对于 php-cli-cygwin 版本构建时也出现过这种问题吗。还是说我的 cygwin 少了一些必要的库没有安装吗?或者说安装过程中少了一些步骤吗?