如何让PCRE与C++配合使用?

9

这是一个新手问题,但我希望我能尽可能清楚地表达我的问题。

我正在尝试在C++中进行模式匹配。

我已经从这里下载了PCRE的Win32版本,并将下载的pcre3.dll和pcreposix3.dll文件放置在Dev-CPP的lib文件夹中(我正在使用Bloodshed Dev-C++ 4.9.9 IDE)。

我还下载了一个pcrecpp.h头文件,并将其放在我正在编写以下代码的相同目录中(实际上不是编写,而是从名为PCRE-Perl Compatible Regular Express的PDF教程中复制示例代码)。

但我无法使它工作。代码如下:

    #include <iostream>
    #include <string>
    #include <pcrecpp.h>

    using namespace std;

    int main()
    {
       int i;
       string s;
       pcrecpp::RE re("(\\w+):(\\d+)");
       if (re.error().length() > 0) {
          cout << "PCRE compilation failed with error: " << re.error() << "\n";
       }
       if (re.PartialMatch("root:1234", &s, &i))
       cout << s << " : " << i << "\n";
    }

当我编译代码时,Dev-C++ 给了我很多错误,包括:"`pcrecpp' 未声明" 和 "RE" 未声明。
我该如何处理下载的文件并解决我的问题?或者是我忽略了一些显而易见的东西吗?

另外,我建议您获取更新的IDE(如果您正在使用与之捆绑的MinGW,则可能还需要更近期的版本);Dev-C ++开发已经停止了几年,据我所知存在一些已知的错误。考虑迁移到Code :: Blocks / CodeLite / MSVC ++ Express / ...,它们都是好的,免费的IDE,并附带最新的编译器。 - Matteo Italia
@Matteo Italia,感谢您的建议。我会仔细查看它们。 - Mike
这是新PCRE2库(PCRE的修订版本)的包装器。虽然它需要C++11。 - Jahid
4个回答

6
如果您在#include中使用尖括号(<>)指定文件,编译器将仅在外部库的位置查找该头文件,只要编译器知道它们的存在。
如果您改为使用引号(""),则编译器还会查找当前项目的位置,通常包括当前目录。 解决您当前问题的快速方法是使用
#include "pcrecpp.h"

另一种方法是告诉编译器可以在哪里找到PCRE库的头文件。
您需要告诉编译器可以在哪里找到PCRE库的头文件。如何做这取决于构建系统,但如果您使用的是IDE,则应该有一个选项来指定“包含目录”。这是您添加PCRE头文件目录(完整路径)的地方。
顺便说一下:当编译器给出大量错误和警告时,请始终从修复第一个开始。我猜在这种情况下,它可能是类似于“无法找到头文件:pcrecpp.h”的问题。通常情况下,如果编译器在遇到问题后尝试继续,那么会发现更多问题是第一个问题的跟进问题。当第一个问题得到解决时,这些问题也会神奇地消失。

@Bart van Ingen Schen,感谢您的指导 :) 我对C++非常陌生。我尝试将括号更改为双引号,但它不起作用。错误消息包括“/pcrecpp.h E:\E pcrecpparg.h: 没有这个文件或目录。”我想也许问题在于我不知道如何将PCRE库链接到编译器或类似的东西。我已经下载了PCRE的开发人员库,并将所有下载的文件放在Dev-C++的lib文件夹中,但也许这是错误的位置或者我需要做其他事情... - Mike
@Mike:显然,pcrecpp.h文件也使用#include <>语法来引入更多的头文件。我已经修改了我的答案。你需要做的是告诉编译器在哪里找到相关的头文件。 - Bart van Ingen Schenau
@Bart van Ingen Schenau,你是对的。问题与包含目录有关!我犯了一个错误,把头文件放在Dev-C++的lib目录中而不是include目录中。现在我已经纠正了这个问题。但是我从编译器收到了新的错误消息。第一个错误是“[链接器错误]未定义对`pcrecpp::no_arg'的引用”。感到沮丧:( 但还是谢谢你的帮助! - Mike
@Mike:你应该有一个或多个带有PCRE库的.lib文件。将它们添加到你的项目中。与Java等语言不同,C和C++编译器不会尝试猜测文件的位置或需要哪些库。你必须明确地指定所有内容。 - Bart van Ingen Schenau
但是你刚才提到 .a 文件通常用于类 Unix 系统。我还有什么遗漏的吗?虽然仍然很令人沮丧,但我很高兴现在学会了如何链接库 :) 感谢您耐心的指导 :) - Mike
显示剩余4条评论

2
         cout << “PCRE compilation failed with error: “ << re.error() << “\n”;

我刚刚复制了你的代码并尝试编译它。我得到了与你报告的相同的错误。 问题在于你放到cout中的字符串没有正确地开始/结束。你应该使用真正的双引号而不是看起来像双引号(")但实际上不是的标记。如果你修复它,你的代码就可以编译而无需任何错误。


2
你需要在g++命令中添加“-lpcrecpp”。

0

您已经包含了

#include <pcrecpp.h> 

第一点需要检查的是您的代码中是否已将文件包含在路径中。您是否下载了可安装程序?请检查它是否已经安装在您的计算机上。

第二点需要检查的是,您是否已定义库路径,以便在编译和链接期间可以解决它们。


感谢您的指导。不需要安装程序。我已经下载了二进制文件和开发人员库,并将所有下载的文件放置在Dev-C++的lib文件夹中。但也许这是错误的位置。但我不知道如何链接库...仍在努力解决问题... - Mike
+1!我犯了一个错误,把下载的文件复制到了Dev-C++的lib文件夹而不是include文件夹中。你说得对。当我尝试将它们替换为Dev-C++的include文件夹时,原始的错误消息就消失了。非常感谢你指出这一点!我直到现在才意识到这一点。我真傻!好吧,虽然有新问题。当我纠正了路径问题并注释掉了PCRE错误处理行后,我现在收到了新的错误消息。它们包括:“[链接器错误]未定义对`pcrecpp::no_arg'的引用”。 - Mike
这是一个链接错误。你检查过库文件的路径了吗?你的编译器无法找到正确的库文件进行链接。设置正确的库文件路径,问题就会消失。 - DumbCoder
这次我已经将下载的库文件(“pcreposix-bcc.lib”,“libpcre.dll.a”,“libpcreposix.dll.a”,“pcre.lib”,“pcre-bcc.lib”,“pcreposix.lib”)添加为Dev-C ++项目选项中的链接器参数。正如你预见的那样,链接器错误已经消失了:) 但现在我收到“文件格式不被识别”的错误。有什么想法吗?谢谢。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接