我正在制作一个共享库,我可以在 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 中删除了扩展指令,而是按如下方式执行:
- cd/etc/php5/mods-available
- sudo vim prq.ini
- 在上面的文件中添加了扩展指令
- sudo php5enmod prq 然后加载了扩展程序。
关于由 SWIG 制作的 php 扩展未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32086354/