Расширение PHP-CPP C++ не может найти регулярное выражение

Я пишу расширение C++ для PHP, и я использую регулярное выражение в моем коде. Вот фрагмент

#include <phpcpp.h>
#include <regex>
#include <iterator>
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <stdio.h>

using namespace std;

Element* parse(std::sregex_iterator iterator, std::sregex_iterator iteratorEnd)
{
    string segmentContent = "";
    // Segment* segment = nullptr;

    while (iterator != iteratorEnd)
    {
        // segment = readSegment(iterator->str());

        ++iterator;
    }

    return nullptr;
};

Php::Value parseFromFile(Php::Parameters &params)
{
    string filePath = params[0];

    ifstream file(filePath);

    if (!file.is_open())
    {
        return nullptr;
    }
    else
    {
        // Read the file into a buffer
        stringstream buffer;

        buffer << file.rdbuf();

        // We now have the buffer so we can close the file
        file.close();

        string regexPattern = string("some pattern here");

        std::regex regexMatcher(regexPattern, regex_constants::icase);

        string fileContents = buffer.str();

        std::sregex_iterator iterator(fileContents.begin(), fileContents.end(), regexMatcher);
        std::sregex_iterator iteratorEnd;

        root = parseXml(iterator, iteratorEnd);

        return Php::Object("SmartXmlParser\\XmlElement", root);
    }
};

Это не скомпилируется, так как я не включил все части кода (их много). Здесь все хорошо компилируется без каких-либо ошибок или предупреждений. Когда я пытаюсь запустить тестовый php-файл, который использует что-либо из этого кода C++, он просто терпит неудачу, выдавая следующую ошибку.

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20131226/myextension.so' - /usr/lib/php5/20131226/myextension.so: undefined symbol: _ZNSt14regex_iteratorIN9__gnu_cxx17__normal_iteratorIPKcSsEEcSt12regex_traitsIcEEC1Ev in Unknown on line 0
PHP Fatal error:  Call to undefined function parseXml() in /home/vagrant/Laravel/extensions/myextension/test.php on line 5
PHP Stack trace:
PHP   1. {main}() /home/vagrant/Laravel/extensions/myextension/test.php:0

Fatal error: Call to undefined function parseXml() in /home/vagrant/Laravel/extensions/myextension/test.php on line 5

Call Stack:
    0.0023     220904   1. {main}() /home/vagrant/Laravel/extensions/myextension/test.php:0

Как только я удаляю методы и фрагменты кода, которые ссылаются на классы регулярных выражений, он работает нормально (я могу оставить включение, и оно все равно будет работать).

Я компилирую, используя эти командные строки:

g++ -Wall -c -O2 -std=c++11 -fpic -o main.o main.cpp
g++ -shared -o myextension.so main.o -lphpcpp
cp -f myextension.so /usr/lib/php5/20131226
cp -f myextension.ini /etc/php5/cli/conf.d

Так как регулярное выражение является частью стандартной библиотеки в C++11, я думаю, мне не нужно связывать регулярное выражение вручную, как это делается автоматически во время выполнения, верно?

Что-то мне не хватает, чтобы заставить его работать с PHP? Я не подвергаю никакие объекты регулярных выражений, они просто средство достижения цели в моем коде C++.

1 ответ

Решение

regex доступно только из GCC версии 4.9.0.

Обновите ваш компилятор gcc и библиотеку времени выполнения gcc до версии 4.9.0 или выше, чтобы она заработала.

Обратите внимание, что regex библиотека из GCC до сих пор не очищена от ошибок, и в Stackru сообщается о серьезной ошибке.

Другие вопросы по тегам