过去两天我一直在尝试在 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