IP2Location PECL 扩展无法安装在 Mac 上,无法链接到仅 dylib 的捆绑包

IP2Location PECL 扩展无法安装在 Mac 上,无法链接到仅 dylib 的捆绑包

过去两天我一直在尝试在 Mac 上安装 IP2Location。我成功安装了 IP2Location C 库,但现在 PECL 扩展出现了问题。

我运行了 phpize,然后运行“sudo ./configure”,然后出现以下错误:

checking for ip2location support... yes, shared
checking for ip2location files in default path... found in /usr/local
checking for IP2Location_open_mem in -lIP2Location... no
configure: error: wrong ip2location, lib version >= 6.x.x is required or library not found

我正在使用最新版本的 IP2Location,所以我知道它是正确的版本。

有人可以解释一下这个错误吗?

我查看了 config.log 并发现这是最后一个错误:

227 configure:4112: checking for ip2location files in default path
228 configure:4117: result: found in /usr/local
229 configure:4269: checking for IP2Location_open_mem in -lIP2Location
230 configure:4294: cc -o conftest -g -O2  -Wl,-rpath,/usr/local/lib -L/usr/local/lib  conftest.c -lIP2Location   >&5
231 ld: can't link with bundle (MH_BUNDLE) only dylibs (MH_DYLIB) file '/usr/local/lib/libIP2Location.so' for architecture x86_64
232 clang: error: linker command failed with exit code 1 (use -v to see invocation)
233 configure:4294: $? = 1
234 configure: failed program was:
235 | /* confdefs.h */
236 | #define PACKAGE_NAME ""
237 | #define PACKAGE_TARNAME ""
238 | #define PACKAGE_VERSION ""
239 | #define PACKAGE_STRING ""
240 | #define PACKAGE_BUGREPORT ""
241 | #define PACKAGE_URL ""
242 | /* end confdefs.h.  */
243 |
244 | /* Override any GCC internal prototype to avoid an error.
245 |    Use char because int might match the return type of a GCC
246 |    builtin and then its argument prototype would still apply.  */
247 | #ifdef __cplusplus
248 | extern "C"
249 | #endif
250 | char IP2Location_open_mem ();
251 | int
252 | main ()
253 | {
254 | return IP2Location_open_mem ();
255 |   ;
256 |   return 0;
257 | }
258 configure:4304: result: no
259 configure:4419: error: wrong ip2location, lib version >= 6.x.x is required or library not found

我已经检查并确认 /usr/local/lib/libIP2Location.so 存在。

运行“文件”得到以下结果:

$ file libIP2Location.so
libIP2Location.so: Mach-O 64-bit bundle x86_64

答案1

这不是你,这是代码......

IP2Location C 库明确构建了一个包(又称可加载模块),但没有构建共享库。在构建时链接包是一个巧妙的技巧,包的构建树中的 GNU libtool 脚本可以做到这一点,但通常其他程序只能在运行时加载包。C 库源还构建了一个静态库,PECL 扩展可以在构建时链接该库,但它不会尝试这样做。同一个人维护这两个软件包,因此您可能可以通过提醒他注意问题来修复它。可以这样做的地方是以下之一:

https://github.com/chrislim2888/IP2Location-PECL-Extension/issues https://github.com/chrislim2888/IP2Location-C-Library/issues

我主张后者,因为在我看来,这像是 C 库构建过程中的一个错误,它有一堆已弃用的 automake 指令,任意将 /opt/lib/(大多数 Mac 上不存在)添加到库搜索路径,并构建一个“测试”程序,该程序在通过 libtool 链接时会生成一个明显的警告:

/bin/sh ../libtool  --tag=CC   --mode=link gcc  -I/usr/include/malloc -no-cpp-precomp  -L/opt/lib -o test-IP2Location test-IP2Location.o ../libIP2Location/libIP2Location.la 

*** Warning: Linking the executable test-IP2Location against the loadable module
*** libIP2Location.so is not portable!
*** Warning: lib libIP2Location.so is a module, not a shared library

您也许可以通过摆弄 C 库源中的自动工具文件并重建真正的共享库来解决问题,或者(也许)弄清楚如何使用 libtool 来链接 PECL 扩展,但我不建议采用这两种方法。

另一种选择:IP2Location 支持的 PHP 绑定是一个 PHP 模块,而不是 PECL 扩展:

https://www.ip2location.com/developers/php

这可能与 C 库的模块或静态库一起工作。

答案2

在 IP2Location-C-Library 中进行以下更改并从头开始重新安装。(sh build.sh)。

然后重新编译你的 PECL。请让我知道结果。

diff --git a/Makefile.am b/Makefile.am
index 37a4714..491c0bd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,3 +1,3 @@
 NULL =
-INCLUDES = -Wall -ansi
+AM_CPPFLAGS = -Wall -ansi
 SUBDIRS =      libIP2Location  test    $(NULL)
diff --git a/libIP2Location/Makefile.am b/libIP2Location/Makefile.am
index 4bc5854..ed00358 100644
--- a/libIP2Location/Makefile.am
+++ b/libIP2Location/Makefile.am
@@ -9,4 +9,4 @@ include_HEADERS = IP2Location.h IP2Loc_DBInterface.h
 libIP2Location_la_SOURCES = IP2Location.c \
                                                        IP2Loc_DBInterface.c 

-libIP2Location_la_LDFLAGS = -module -no-undefined -version-info 1:0:0 
+libIP2Location_la_LDFLAGS = -no-undefined -version-info 1:0:0 

相关内容