由 SWIG 制作的 php 扩展未加载

标签 php c++ swig

我正在制作一个共享库,我可以在 SWIG 的帮助下在 PHP 中使用它。该库基于一些也调用 fortran 函数的 C++ 代码。是的,这太疯狂了。我做的第一件事是创建一个 FORTRAN 子程序的共享库。我使用 cmake 执行此操作,它生成了文件 libmasterfile.so。下一部分是将 C++ 代码编译成对象:

g++ -O2 -g -Wall -c -fmessage-length=0 -std=c++11 -fPIC -MMD -MP -MF"Chunk.d" -MT"Chunk.d" -o "Chunk.o" "../Chunk.cpp"
g++ -O2 -g -Wall -c -fmessage-length=0 -std=c++11 -fPIC -MMD -MP -MF"MasterFile.d" -MT"MasterFile.d" -o "MasterFile.o" "../MasterFile.cpp"
g++ -O2 -g -Wall -c -fmessage-length=0 -std=c++11 -fPIC -MMD -MP -MF"Package.d" -MT"Package.d" -o "Package.o" "../Package.cpp"
g++ -O2 -g -Wall -c -fmessage-length=0 -std=c++11 -fPIC -MMD -MP -MF"Queue.d" -MT"Queue.d" -o "Queue.o" "../Queue.cpp"
g++ -O2 -g -Wall -c -fmessage-length=0 -std=c++11 -fPIC -MMD -MP -MF"Variable.d" -MT"Variable.d" -o "Variable.o" "../Variable.cpp"

然后我写了swig共享库的接口(interface)文件:

%module prq
%{
#include "Chunk.h"
#include "ConcreteQueue.h"
#include "ConcreteRequest.h"
#include "MasterFile.h"
#include "Package.h"
#include "Queue.h"
#include "QueueFactory.h"
#include "Request.h"
#include "RequestFactory.h"
#include "Variable.h"
using namespace PRQ;
%}
%include "../Chunk.h"
%include "../ConcreteQueue.h"
%include "../ConcreteRequest.h"
%include "../MasterFile.h"
%include "../Package.h"
%include "../Queue.h"
%include "../QueueFactory.h"
%include "../Request.h"
%include "../RequestFactory.h"
%include "../Variable.h"

接下来是 swig,然后用 g++ 编译 swig,最后将所有东西链接在一起:

swig -c++ -php5 prq.i
g++ `php-config --includes` -std=c++11 -O2 -fPIC -c prq_wrap.cpp
g++ -shared Chunk.o MasterFile.o Package.o Queue.o Variable.o prq_wrap.o -o prq.so -L/home/jlahowetz2/development/package-request-queue/ -lmasterfile -lgfortran

所有这些似乎都能正确编译。我通过 php.ini 添加了扩展并重新启动了 apache2。 php 错误日志没有显示任何错误,当我查看扩展是否已加载时,一切似乎都很好,但我什么也没得到:

php -m | grep prq

从命令行使用 php 脚本我得到了相同的结果,在这种情况下否:

<?php 
echo "START\n";
if (extension_loaded("prq")) echo "YES\n";
else echo "NO\n";
echo "END\n";
?>

那我现在去哪里呢?不知道为什么 php 没有加载扩展。有什么想法吗?

最佳答案

我从 php.ini 中删除了扩展指令,而是按如下方式执行:

  1. cd/etc/php5/mods-available
  2. sudo vim prq.ini
  3. 在上面的文件中添加了扩展指令
  4. sudo php5enmod prq 然后加载了扩展程序。

关于由 SWIG 制作的 php 扩展未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32086354/

相关文章:

lua - 如何为接受并返回 2 个表的函数创建 SWIG 类型映射

python - SWIG 结构指针作为输出参数

php - 使用 Redis 缓存 Eloquent 模型实例

php - 找不到类 'HttpResponse'

c++ - 使用 Dijkstra 在 boost 图中查找最短路径

c++ - 为什么模板只能在头文件中实现?

c++ - ‘<’ token 之前的预期初始值设定项

php - 获取实时响应

php - 使用 Sphinx 过滤多对多 int 值

python - SWIG(C 和 Python)cstring.i 问题